模拟模拟器中的活动查杀

Ste*_*teD 21 android activity-lifecycle android-activity

我想测试一下onSaveInstanceStateonRestoreInstanceState我在模拟器应用程序.

我发现了这个,它说我们可以在方向更改期间模拟这个,但是我将一些变量存储在应用程序级别(子类android.app.Application)中,因此方向更改不会消除变量.

所以我的问题是,我如何模拟低内存情况,从而杀死我的活动?

希望我已经清楚了.谢谢

Ted*_*opp 21

您可以暂停您的应用程序(通过按Home键,模拟呼叫,等等).然后通过adb终止应用程序的进程.由于文档说在onPause()之后返回你的应用程序可以在没有任何进一步通知的情况下被杀死,这是一个公平的测试.

  • 得到它,用ps来获取PID并杀死<pid> (3认同)
  • 这是一个非常有用的提示,谢谢.PS如果您正在使用eclipse,您可以从DDMS角度杀死该进程. (3认同)
  • 就好像其他人像我这样偶然发现:请参阅http://developer.android.com/guide/developing/debugging/index.html>调试提示(所需命令为adb shell,ps,kill pid) (2认同)

The*_*heo 15

要测试onSaveInstanceState和onRestoreInstanceState事件,可以使用SetAlwaysFinish实用程序(请参阅下面的链接).它使用名为Always Finish的隐藏系统设置来更改Android系统的行为.启用"始终完成"选项后,Android操作系统将立即卸载从前台移动到后台的任何活动,从而触发其onSaveInstanceState事件.然后,当系统再次需要活动时,会强制重新加载它,从而触发onRestoreInstanceState事件.

与杀死进程相比,此方法的优点是它更容易,并且您可以获得更精细的控制(活动级别而不是进程级别).

有关该工具及其使用方法的更多详细信息,请参阅下面的博客文章:http: //bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/

在"开发设置">"立即销毁活动"下的DevTools应用程序中的模拟器中也存在"始终完成"功能.但是,DevTools应用程序在模拟器之外不起作用.

  • 更好的是,Galaxy Nexus在Developer选项中有一个选项"Do not keep activities".如果超过4.2,你必须先解锁它们 (2认同)

Woo*_*kie 8

Android 6及更高版本中有一个更加可靠的解决方案.我在Android 6,7和8上成功使用了以下方法:

1)打开您的应用程序,转到要测试还原的活动,然后按"主页"按钮将其保留

2)打开"设置"应用,转到"系统" - >"开发者选项",然后点击"运行服务"

3)点击右上角的"显示缓存进程",然后在列表中找到您的应用,点击它,然后点击"停止"按钮.

4)使用最近的应用列表返回到您的应用.它应该重新启动您之前从中留下的活动的整个应用程序.

我发现这是足以完全终止该应用,包括所有的应用程序委托的东西和C/C++本地代码的状态,然后测试使用保存的活动状态.这有效地复制在用户离开时发生了什么重新推出它应用程序暂时,然后系统杀死它以节省内存,电池或其他任何东西.


hel*_*sim 6

您可以在开发人员设置中使用"不要保留活动"设置,也可以自行终止应用程序进程.

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

在此输入图像描述


num*_*ati 5

让我们澄清你的问题.

但在我们这样做之前,这是一个关于onSaveInstanceState的事实 - 它被各种原因调用,例如:

  • 方向改变
  • 从前景到背景(通过单击主页或启动其他活动或单击最近)
  • 系统内存不足

现在,如果您的问题是"我如何模拟onSaveInstance的调用仅用于测试目的",那么Theo和Ted的答案是正确的.更改开发人员设置选项或按home将导致调用onSaveInstance.

但这样只会改变方向(如你在你的问题说明) - 这使我相信,你可能会问:"我怎么可以模拟调用onSaveInstance方法当系统内存不足的压力下"

对这个问题的简短回答是没有自动的方法来模拟低内存条件.上述技术仅模拟调用onSaveInstanceState方法而不是低内存条件本身

几个警告在这里.

对此的第一个警告是,在极端条件下,内核将"不洁"地杀死您的进程以声明内存 - 这意味着永远不会调用onSaveInstanceState.在这种情况下,测试onSaveInstanceState是没有意义的.关于这种情况你无能为力,但好消息是它是一个非常罕见的事件.用于前景活动.

第二个警告是,ActivityManager可以通过"干净地杀死它"来回收你的活动资源,即你的onSaveInstance会被调用.这发生在不在前台的活动(即用户不可见,因此已经处于停止状态)并且系统处于内存压力下.

在第二个警告中,再次无法自动模拟这种情况.如果您手动启动一堆重型活动并希望ActivityManager被强制回收您的某个活动,则可以执行此操作.

这里要记住的更重要的一点是,不需要模拟低内存条件.只要您模拟调用onSaveInstanceState的方式,就会自动测试可能在低内存情况下调用它的条件.触发此方法的最简单方法是更改​​模拟器上的方向(ctrl-f11).如果您使用实际设备临时更改开发人员设置("不要保留活动")