【问题标题】:How to simulate killing activity to conserve memory?如何模拟杀戮活动以节省内存?
【发布时间】:2011-01-22 06:56:56
【问题描述】:

Android 文档说:

“当系统而不是用户关闭活动以节省内存时,...”

但是如何模拟这种情况呢?我想调试onRestoreInstanceState(Bundle)方法,但是不知道怎么做。

【问题讨论】:

    标签: android activity-lifecycle onrestoreinstancestate


    【解决方案1】:

    您不能以自动化的方式完成它,因为它完全不确定。

    请在此处查看我的答案:https://stackoverflow.com/a/15048112/909956 了解详情。

    但好消息是,您需要做的只是模拟调用 onSaveInstanceState 并且您正在间接测试这种低内存情况。

    onSaveInstanceState 可以通过以下方式触发:

    1. 失去焦点(按 home 键,本质上就像从您的应用切换到启动器应用),启动另一个活动,按最近更新
    2. 改变方向。如果您使用的是模拟器,这是更简单的方法
    3. 更改开发者设置:转到开发者选项 --> 应用程序 --> 不保留活动。如果您临时在实际设备上进行测试,这是最佳选择。

    【讨论】:

      【解决方案2】:

      我已使用“不保留活动”开发人员选项来重现由于内存压力导致活动被终止时发生的崩溃。您可以在Settings->Developer Options 的Apps 部分找到它。

      它会在您离开后立即销毁 每个 活动。例如。如果您按 home 将您的应用程序置于后台,则当前活动将被破坏。请参阅https://stackoverflow.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

            【讨论】:

              猜你喜欢
              • 2017-02-28
              • 2010-11-09
              • 1970-01-01
              • 1970-01-01
              • 2015-08-25
              • 1970-01-01
              • 1970-01-01
              • 2010-10-19
              • 2021-12-16
              相关资源
              最近更新 更多