Android 恢复时间内存优化

Android 恢复时间内存优化,android,android-activity,android-lifecycle,android-memory,Android,Android Activity,Android Lifecycle,Android Memory,我写这个问题是基于一些事实。 例如,我们不能显式地控制垃圾收集器(GC),因此也无法检查GC何时从暂停的活动中提取内存 我所说的测试用例: 我在onCreate方法中分配了许多对象,包括HashMaps和ArrayList。 其中一些用于存储位图的引用。 现在用户通过按home按钮暂停活动。 在执行其他任务很长一段时间后,我忘记恢复相同的任务。 现在当我回到我暂停的活动 问题是:1)在这种情况下,是否有机会假装或假设memeory GC将首先获取什么 2) gc是否只获取整个活动或少数空闲和空对

我写这个问题是基于一些事实。 例如,我们不能显式地控制垃圾收集器(GC),因此也无法检查GC何时从暂停的活动中提取内存

我所说的测试用例: 我在onCreate方法中分配了许多对象,包括HashMaps和ArrayList。 其中一些用于存储位图的引用。 现在用户通过按home按钮暂停活动。 在执行其他任务很长一段时间后,我忘记恢复相同的任务。 现在当我回到我暂停的活动

问题是:1)在这种情况下,是否有机会假装或假设memeory GC将首先获取什么

2) gc是否只获取整个活动或少数空闲和空对象

3) 假设在很长一段时间后,比如说大约5到6个小时,用户正在恢复活动,我怎么知道一些对象是垃圾收集的呢

4) 若一些对象是垃圾收集的,那个么在onResume中检查它们是否为null就足以进一步访问它们

5) 在这种情况下如何处理空指针访问

我很想听到每一个建议。 谢谢你的关注。 快乐编码。

据我所知,GC运行在VM中的所有对象上,若并没有对某个对象的引用,那个么它将被删除。Android活动有点不同,它有自己的特点。
当Androids需要更多RAM用于其他应用程序(活动)时,则在您的活动中调用
onSaveInstanceState(Bundle outState)
。在这里,您应该保存捆绑所需的所有内容,当用户返回到您的活动时,您可以在恢复InstanceState(捆绑保存状态状态)中恢复这些对象。

编辑:我的应用程序的一部分,例如:

公共类窗口{
公共窗口(捆绑){
最大化=bundle.getBoolean(“最大化”,最大化);
显示=bundle.getBoolean(“显示”,显示);
最小化=bundle.getBoolean(“最小化”,最小化);
resizable=bundle.getBoolean(“resizable”,resizable);
方向=bundle.getInt(“方向”);
}
公共捆绑包(){
Bundle=新Bundle();
bundle.putBoolean(“最大化”,最大化);
bundle.putBoolean(“已显示”,已显示);
bundle.putBoolean(“最小化”,最小化);
bundle.putBoolean(“可调整大小”,可调整大小);
bundle.putInt(“方向”,方向);
返回包;
}
}
和主要活动:

公共类MainActivity扩展活动{
阵列列表窗口;
[...]
@凌驾
SaveInstanceState上的公共无效(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
Bundle[]windowsBundle=新Bundle[windows.size()];

对于(int i=0;i如果你的活动已经在后台运行了5或6个小时,那么几乎可以保证Android已经终止了托管进程。当用户返回到你的应用程序时,Android将为该应用程序创建一个新进程,然后重新启动一个活动。一般来说,5或6个小时后,Android将放弃任何保存的状态并重新启动只需从头开始重新启动应用程序(除非您特别为根活动(启动活动)指定了
android:alwaysRetainTaskState=“true”

如果您在5或6小时后返回“暂停”活动,并且应用程序的进程已终止并重新创建,
onCreate()
将在
onResume()之前的活动中再次调用
onCreate()


GC与此无关。如果您的活动实例处于活动状态,GC将不会回收它引用的任何对象。如果您看到变量被设置为
null
,这是因为Android已终止您的进程,然后又创建了一个新进程。

您的意思是,即使我在应用程序内部导航,我也应该对每个活动执行此操作。Y将每个对象保存到bundle可能看起来很累,但有人认为这是保存活动数据的最佳方式。好吧,android只会杀死你的活动或(应用程序)在内存不足和频繁使用的情况下,我真的怀疑它是否会根据时间终止任何暂停的活动。我真的对你的答案感兴趣,因为如果它终止进程,就必须释放它分配的所有内存引用。图中显示了GC。实际上,Android可以随时终止你的进程在较新的设备(Android 4.0及以上)上,尤其是在HTC设备上,“进程终止”更具攻击性。在大多数情况下,如果你的应用程序在后台的时间超过几分钟,它很可能会被终止。请寻找Android在任务暂停30分钟后清除任务的解释。关于你对GC和进程终止的评论,你错了:当Android终止你的进程时,它只会终止OS pro它不调用任何组件上的
onDestroy()
,它根本不调用GC,因为当它终止进程时,VM(虚拟机)也被终止,因此它不需要清理任何资源。Android经常这样做,你需要确保你的代码能够处理它。