如何模拟杀戮活动以节省内存?

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 OptionsApps 部分找到它。

它会在您离开后立即销毁 每个 活动。例如。如果您按 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

【讨论】:

以上是关于如何模拟杀戮活动以节省内存?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 Spring 以节省尽可能多的内存?

子类化 SimpleCursorAdapter 以包含 convertView 以节省内存

我应该如何在 CodeIgniter4 中组织我的文件结构以节省内存?

以节省内存的方式增长 data.frame

python 逐步写入`npz`文件以节省内存

如何在 C++ 应用程序中模拟高存储活动