25

我想在模拟器上测试我的应用程序onSaveInstanceStateonRestoreInstanceState

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

所以我的问题是,我怎样才能模拟低内存情况从而杀死我的活动?

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

4

7 回答 7

24

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

如果您不想费心寻找应用程序进程的 pid,可以使用adb shell am kill com.example.package_name杀死应用程序进程。确保将应用程序置于后台。文档说这个命令“只杀死可以安全杀死并且不会影响用户体验的进程”。因此,您可能想在尝试这个之前启动其他几个应用程序。

于 2011-03-13T04:02:43.240 回答
15

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

与杀死进程相比,这种方法的优势在于它更容易并且您可以获得更好的控制(活动级别而不是进程级别)。

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

在开发设置 > 立即销毁活动下的 DevTools 应用程序的模拟器中也存在 Always Finish 功能。但是,DevTools 应用程序无法在模拟器之外运行。

于 2011-12-23T22:42:38.373 回答
15

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

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

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

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

4) 使用最近的应用程序列表返回您的应用程序。它应该在您之前离开的活动上重新启动整个应用程序。

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

于 2017-09-14T19:57:26.027 回答
6

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

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

在此处输入图像描述

于 2016-06-22T20:56:55.330 回答
5

让我们澄清你的问题。

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

  • 方向改变
  • 从前台到后台(通过单击主页或启动另一个活动或单击最近)
  • 系统内存不足

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

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

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

这里有几个警告。

对此的第一个警告是,在极端条件下,内核将“不干净地”杀死您的进程以获取内存——这意味着永远不会调用 onSaveInstanceState。在这种情况下,测试 onSaveInstanceState 没有实际意义。对于这种情况,您无能为力,但好消息是这是一个非常罕见的事件,尤其是。用于前台活动。

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

在第二个警告中,您不能自动模拟这种情况。如果您手动启动大量繁重的活动并希望 ActivityManager 强制回收您的一项活动,则可以做到这一点。

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

于 2013-02-24T02:39:37.047 回答
0

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

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

于 2011-03-13T03:55:41.183 回答
0

对我有用的最简单的解决方案就是改变设备的方向(无论你使用的是 AVD、Genymotion 还是任何其他模拟器,你都可以这样做)。默认情况下,系统将Activity通过调用onDestory后跟onCreate.

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

android:configChanges="orientation"
于 2015-05-28T09:04:29.003 回答