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

Android 如何模拟杀戮活动以节省内存?,android,activity-lifecycle,onrestoreinstancestate,Android,Activity Lifecycle,Onrestoreinstancestate,安卓医生说: 当系统而不是用户关闭某个活动以节省内存时 但是如何模拟这种情况呢?我想调试onRestoreInstanceState(Bundle)方法,但不知道如何调试。为了调试onRestoreInstanceState(),只需更改屏幕方向([Ctrl]-[F11]在模拟器中)。您的活动将被销毁并重新创建,并且将调用onSaveInstanceState()/onRestoreInstanceState()对。使用SetAlwaysFinish应用程序(在真实设备和模拟器中工作)或使用Go

安卓医生说:

当系统而不是用户关闭某个活动以节省内存时


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

为了调试
onRestoreInstanceState()
,只需更改屏幕方向([Ctrl]-[F11]在模拟器中)。您的活动将被销毁并重新创建,并且将调用
onSaveInstanceState()
/
onRestoreInstanceState()
对。

使用SetAlwaysFinish应用程序(在真实设备和模拟器中工作)或使用Google DevTools应用程序(仅在模拟器中工作)

这些应用程序使用ActivityManager活动类的hidden AlwaysFinish设置来更改操作系统的行为,并使其在每个活动不再位于前台时立即卸载。这将可靠地触发onSaveInstanceState和onRestoreInstanceState事件

有关更多详细信息,请参阅下面的链接:
你不能用自动化的方式来做这件事b/c它是完全不确定的

请参阅我的答案:有关详细信息

但好消息是,您只需模拟调用saveInstanceState,就可以间接测试这种内存不足的情况

onSaveInstanceState可通过以下方式触发:

  • 失去焦点(按home键本质上就像从应用程序切换到launcher应用程序),启动另一个活动,按recents键
  • 改变方向。如果您使用的是仿真器,这是更简单的方法
  • 更改开发人员设置:转到开发人员选项-->应用-->不保留活动。如果您在实际设备上进行临时测试,这是最好的选择
  • 要调试onRestoreInstanceState,可以执行以下操作:

    • 确保您可以在应用程序启动后立即对其进行调试(从构造函数帮助中调用android.os.debug.waitForDebugger(),它将挂起应用程序,直到调试器连接为止)

    • 让你的申请处于某种状态

    • 从设置->应用程序中因果杀死它

    • 通过“最近的应用”按钮(它仍将在列表中)因果切换回它

    • 此时,您的应用程序将重新启动,并且将立即在顶部活动上调用onRestoreInstanceState

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


    一旦你离开它,它就会摧毁一切活动。例如,如果按home键将应用程序置于后台,则当前活动将被销毁。有关更多信息,请参阅。

    有两种方法可以模拟android杀戮过程:在开发者设置中使用“不保留活动”设置,或者自己杀戮应用程序过程

    要终止进程,请打开要测试的活动,然后按home按钮将应用程序发送到后台,然后使用Android Studio(Android设备监视器)中的DDMS,选择进程,然后停止进程(如下图所示)。你的应用程序被杀了。现在,再次打开你的应用程序(访问打开的应用程序列表)。现在您可以测试被杀死的状态

    这里有很好的答案


    现在,在遥远的将来,在Android Studio中使用Instant Run还将在重新启动活动并更改代码时触发保存和恢复

    Android 6及更新版本中有一个不错的解决方案。在这里查看我的答案:

    这不适用于单独控制方向或具有固定方向的应用程序。以及如何在设备上测试。目前没有可用的模拟器,因此必须在实际设备上进行测试。另外,如果某个活动仅声明纵向,则更改方向不是选项。@f470071:“以及如何在设备上测试”——旋转设备。或者更改区域设置。或者在Android 4.0+设备上更改字体比例。“目前没有可用的模拟器,所以测试必须在实际设备上进行”——Android SDK模拟器适用于许多开发人员;其他人则使用Genymotion。Android SDK模拟器是一种降低速度的方法。无法在Genymotion上安装Google Play服务。这就是为什么测试是如此令人沮丧的折磨。旋转设备不是选项,因为活动设置为固定方向。终止活动。好。不会重新启动应用程序并重新启动到上次打开的活动-我们真正需要测试的是测试实际场景。谢谢!也可以在Android监视器窗口中完成,红色的终止应用程序按钮遵循相同的过程哇,你刚刚帮我重现了一堆奇怪的错误,这些错误总是发生在客户端的设备上,从来没有发生在我的设备上!单独设置“不保留活动”似乎不同于终止流程。它不会重新创建应用程序对象,因此假设存储在应用程序对象中的“全局”状态的活动很可能会崩溃。