如何模拟杀戮活动以节省内存?
Posted
技术标签:
【中文标题】如何模拟杀戮活动以节省内存?【英文标题】:How to simulate killing activity to conserve memory? 【发布时间】:2011-01-22 06:56:56 【问题描述】:android 文档说:
“当系统而不是用户关闭活动以节省内存时,...”
但是如何模拟这种情况呢?我想调试onRestoreInstanceState(Bundle)
方法,但是不知道怎么做。
【问题讨论】:
【参考方案1】:您不能以自动化的方式完成它,因为它完全不确定。
请在此处查看我的答案:https://***.com/a/15048112/909956 了解详情。
但好消息是,您需要做的只是模拟调用 onSaveInstanceState 并且您正在间接测试这种低内存情况。
onSaveInstanceState 可以通过以下方式触发:
-
失去焦点(按 home 键,本质上就像从您的应用切换到启动器应用),启动另一个活动,按最近更新
改变方向。如果您使用的是模拟器,这是更简单的方法
更改开发者设置:转到开发者选项 --> 应用程序 --> 不保留活动。如果您临时在实际设备上进行测试,这是最佳选择。
【讨论】:
【参考方案2】:我已使用“不保留活动”开发人员选项来重现由于内存压力导致活动被终止时发生的崩溃。您可以在Settings->Developer Options
的Apps
部分找到它。
它会在您离开后立即销毁 每个 活动。例如。如果您按 home 将您的应用程序置于后台,则当前活动将被破坏。请参阅https://***.com/a/22402360/2833126 了解更多信息。
【讨论】:
杀死活动。好的。不重新启动应用程序并重新启动到最后打开的 Activity - 我们真正需要测试以测试实际场景。【参考方案3】:模拟android杀进程有两种方式:使用开发者设置中的“Don't keepactivity”设置或自行杀掉应用进程。
要终止进程,请打开您要测试的活动,然后按主页按钮将您的应用发送到后台,然后使用 Android Studio(Android 设备监视器)中的 DDMS,选择该过程,然后停止该过程(如下图所示)。你的应用程序被杀死了。现在,再次打开您的应用程序(访问打开的应用程序列表)。现在你可以测试被杀死的状态了。
【讨论】:
谢谢!也可以在 Android Monitor 窗口中使用红色的 Terminate Application 按钮按照相同的过程完成 哇,你刚刚帮我重现了一堆奇怪的错误,这些错误总是发生在客户的设备上,而从来没有发生在我的设备上!单独设置“不保留活动”似乎与终止进程不同。它不会重新创建 Application 对象,因此假设存储在 Application 对象中的“全局”状态的活动很可能会崩溃。【参考方案4】:为了调试onRestoreInstanceState()
,只需更改屏幕方向(模拟器中的[Ctrl]-[F11])。您的活动将被销毁并重新创建,onSaveInstanceState()
/onRestoreInstanceState()
对将被调用。
【讨论】:
这不适用于自行控制方向或具有固定方向的应用。 以及如何在设备上进行测试。目前没有可用的模拟器,因此必须在实际设备上进行测试。此外,如果活动仅声明肖像,则更改方向不是一种选择。 @f470071:“以及如何在设备上进行测试”——旋转设备。或者更改语言环境。或更改 Android 4.0+ 设备上的字体比例。 “目前没有可用的模拟器,因此必须在实际设备上进行测试”——Android SDK 模拟器适用于许多开发人员;其他人使用 Genymotion。 Android SDK 模拟器太慢了。在 Genymotion 上无法安装 Google Play 服务。这就是为什么测试是如此令人沮丧的考验。不能选择旋转设备,因为活动设置为固定方向。【参考方案5】:使用 SetAlwaysFinish 应用(在真实设备和模拟器中运行)或使用 Google DevTools 应用(仅在模拟器中运行)。
这些应用程序使用 ActivityManagerNative 类的隐藏 AlwaysFinish 设置来更改操作系统的行为,并使其在不再处于前台时立即卸载每个活动。这将可靠地触发 onSaveInstanceState 和 onRestoreInstanceState 事件。
查看以下链接了解更多详情: http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/
【讨论】:
【参考方案6】:要调试 onRestoreInstanceState,您可以执行以下操作:
确保您可以在应用程序启动后立即对其进行调试(从您的构造函数中调用 android.os.Debug.waitForDebugger() 会有所帮助,它会挂起您的应用程序直到连接调试器),
将您的应用程序置于某种状态,
从 Settings->Apps 直接杀死它,
通过最近的应用程序按钮随意切换回它(它仍然会在列表中),
此时您的应用程序将重新启动,并且 onRestoreInstanceState 将立即在顶部 Activity 上调用。
【讨论】:
【参考方案7】:这里有很好的答案。
现在,在遥远的未来,在 Android Studio 中使用 Instant Run 也将在 Activity 重新启动并更改代码时触发保存和恢复。
【讨论】:
【参考方案8】:在 Android 6 及更高版本中有一个不错的解决方案。在这里查看我的答案:Simulate killing of activity in emulator
【讨论】:
以上是关于如何模拟杀戮活动以节省内存?的主要内容,如果未能解决你的问题,请参考以下文章
子类化 SimpleCursorAdapter 以包含 convertView 以节省内存