模拟模拟器中的活动查杀

时间:2011-03-13 03:39:26

标签: android android-activity activity-lifecycle

我想在模拟器上为我的应用测试{​​{1}}和onSaveInstanceState

我找到了this,它说我们可以在方向更改期间模拟这个,但我将一些变量存储在应用程序级别(子类onRestoreInstanceState),所以方向更改确实如此不要消灭变量。

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

希望我已经说清楚了。感谢

7 个答案:

答案 0 :(得分:20)

您可以暂停您的应用程序(通过按Home键,模拟通话,等等)。然后通过adb终止应用程序的进程。由于文档说在onPause()之后返回你的应用程序可能会被杀死而不另行通知,这是一个公平的测试。

答案 1 :(得分: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应用程序在模拟器之外不起作用。

答案 2 :(得分:6)

您可以在开发者设置中使用“不要保留活动”设置,也可以自行终止应用程序。

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

enter image description here

答案 3 :(得分:6)

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

1)打开您的应用,转到您要测试恢复的活动,然后按主页按钮

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

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

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

我发现这足以完全杀死应用程序,包括任何应用委托代理和C / C ++本机代码状态,然后测试重新启动它与保存的活动状态...这有效地复制了什么当用户离开应用程序一段时间然后系统将其杀死以节省内存,电池或其他任何事情时发生。

答案 4 :(得分:5)

让我们澄清你的问题。

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

  • 方向改变
  • 从前台到后台(通过点击主页或启动其他活动或点击最新活动)
  • 系统内存不足

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

但是改变方向也是如此(正如你在问题中所指出的那样) - 这让我相信你可能会问“当系统处于低内存压力时我如何模拟调用onSaveInstance方法”

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

这里有几点需要注意。

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

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

在第二个警告中,再次无法自动模拟这种情况。如果你手动启动一堆重型活动并希望ActivityManager被迫回收你的一个活动,就可以完成。

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

答案 5 :(得分:0)

来自android doc,http://developer.android.com/reference/android/content/ComponentCallbacks.html#onLowMemory()

这是由系统触发的。我认为您可以在创建Android虚拟设备期间将设备ram大小设置得更低。 (在硬件中,选择“设备柱塞尺寸”)

答案 6 :(得分:0)

对我有用的最简单的解决方案就是改变设备的方向(无论您使用AVD,Genymotion还是其他任何仿真器,都可以这样做)。默认情况下,系统会通过调用Activity后跟onDestory来重新创建onCreate

确保AndroidManifest.xml上的Activity 未在下定义属性

android:configChanges="orientation"