Ste*_*teD 21 android activity-lifecycle android-activity
我想测试一下onSaveInstanceState
和onRestoreInstanceState
我在模拟器应用程序.
我发现了这个,它说我们可以在方向更改期间模拟这个,但是我将一些变量存储在应用程序级别(子类android.app.Application
)中,因此方向更改不会消除变量.
所以我的问题是,我如何模拟低内存情况,从而杀死我的活动?
希望我已经清楚了.谢谢
Ted*_*opp 21
您可以暂停您的应用程序(通过按Home键,模拟呼叫,等等).然后通过adb终止应用程序的进程.由于文档说在onPause()之后返回你的应用程序可以在没有任何进一步通知的情况下被杀死,这是一个公平的测试.
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应用程序在模拟器之外不起作用.
Android 6及更高版本中有一个更加可靠的解决方案.我在Android 6,7和8上成功使用了以下方法:
1)打开您的应用程序,转到要测试还原的活动,然后按"主页"按钮将其保留
2)打开"设置"应用,转到"系统" - >"开发者选项",然后点击"运行服务"
3)点击右上角的"显示缓存进程",然后在列表中找到您的应用,点击它,然后点击"停止"按钮.
4)使用最近的应用列表返回到您的应用.它应该重新启动您之前从中留下的活动的整个应用程序.
我发现这是足以完全终止该应用,包括所有的应用程序委托的东西和C/C++本地代码的状态,然后测试使用保存的活动状态.这有效地复制在用户离开时发生了什么重新推出它应用程序暂时,然后系统杀死它以节省内存,电池或其他任何东西.
您可以在开发人员设置中使用"不要保留活动"设置,也可以自行终止应用程序进程.
要终止该过程,请打开要测试的活动,然后按主页按钮将应用程序发送到后台,然后使用Android Studio中的DDMS(Android设备监视器)选择该过程,然后停止该过程(如图所示)在下图中).你的应用程序被杀了.现在,再次打开您的应用程序(访问打开的应用程序列表).现在你可以测试被杀死的状态.
让我们澄清你的问题.
但在我们这样做之前,这是一个关于onSaveInstanceState的事实 - 它被各种原因调用,例如:
现在,如果您的问题是"我如何模拟onSaveInstance的调用仅用于测试目的",那么Theo和Ted的答案是正确的.更改开发人员设置选项或按home将导致调用onSaveInstance.
但这样只会改变方向(如你在你的问题说明) - 这使我相信,你可能会问:"我怎么可以模拟调用onSaveInstance方法当系统内存不足的压力下"
对这个问题的简短回答是没有自动的方法来模拟低内存条件.上述技术仅模拟调用onSaveInstanceState方法而不是低内存条件本身
几个警告在这里.
对此的第一个警告是,在极端条件下,内核将"不洁"地杀死您的进程以声明内存 - 这意味着永远不会调用onSaveInstanceState.在这种情况下,测试onSaveInstanceState是没有意义的.关于这种情况你无能为力,但好消息是它是一个非常罕见的事件.用于前景活动.
第二个警告是,ActivityManager可以通过"干净地杀死它"来回收你的活动资源,即你的onSaveInstance会被调用.这发生在不在前台的活动(即用户不可见,因此已经处于停止状态)并且系统处于内存压力下.
在第二个警告中,再次无法自动模拟这种情况.如果您手动启动一堆重型活动并希望ActivityManager被强制回收您的某个活动,则可以执行此操作.
这里要记住的更重要的一点是,不需要模拟低内存条件.只要您模拟调用onSaveInstanceState的方式,就会自动测试可能在低内存情况下调用它的条件.触发此方法的最简单方法是更改模拟器上的方向(ctrl-f11).如果您使用实际设备临时更改开发人员设置("不要保留活动")
归档时间: |
|
查看次数: |
13119 次 |
最近记录: |