Android会杀死一个进程,如果它在后台,而操作系统决定它需要资源(RAM, CPU等)。我需要能够在测试期间模拟这种行为,以便确保我的应用程序行为正确。我希望能够以自动的方式执行此操作,以便无论何时发生此操作,我都可以测试应用程序的行为是否正确,这意味着我必须在每个活动中测试它,等等。

我知道如何终止我的进程。这不是问题所在。问题是当我杀死我的进程(使用DDMS, adb shell kill, process . killprocess()等)时,Android不会像Android操作系统杀死它一样重新启动它。

如果Android OS杀死了进程(由于资源需求),当用户返回到应用程序时,Android将重新创建进程,然后重新创建活动堆栈上的顶部活动(调用onCreate())。

另一方面,如果我杀死进程,Android假设活动堆栈顶部的活动表现不佳,因此它自动重新创建进程,然后从活动堆栈中删除顶部活动,并重新创建顶部活动下面的活动(调用onCreate() ')。这不是我想要的行为。我想要与Android终止进程时相同的行为。

简单地解释一下,如果我的activity栈是这样的:

    ActivityA -> ActivityB -> ActivityC -> ActivityD

如果Android终止了该进程,用户返回到应用程序,Android将重新创建该进程并创建ActivityD。

如果我杀死了进程,Android会重新创建进程并创建ActivityC。


当前回答

对我来说,最好的测试方法是这样的:

在应用程序中打开ActivityD 按Home键 在Android Studio的Logcat窗口中按下终止应用程序(这会杀死应用程序进程,确保你在Logcat顶部的下拉菜单中选择了你的设备和进程) 长按Home键返回应用程序或打开的应用程序(取决于设备) 应用程序将在重新创建的ActivityD中启动(ActivityA, ActivityB, ActivityC已死,当您返回时将重新创建它们)

在一些设备上,你也可以回到应用程序(ActivityD)与应用程序->你的启动器图标,但在其他设备上,它将启动ActivityA代替。

Android文档是这么说的:

通常,在某些情况下,当用户从主屏幕重新选择该任务时,系统会清除该任务(从根活动之上的堆栈中删除所有活动)。通常,如果用户在一定时间内(比如30分钟)没有访问该任务,就会执行此操作。

其他回答

对我来说,最好的测试方法是这样的:

在应用程序中打开ActivityD 按Home键 在Android Studio的Logcat窗口中按下终止应用程序(这会杀死应用程序进程,确保你在Logcat顶部的下拉菜单中选择了你的设备和进程) 长按Home键返回应用程序或打开的应用程序(取决于设备) 应用程序将在重新创建的ActivityD中启动(ActivityA, ActivityB, ActivityC已死,当您返回时将重新创建它们)

在一些设备上,你也可以回到应用程序(ActivityD)与应用程序->你的启动器图标,但在其他设备上,它将启动ActivityA代替。

Android文档是这么说的:

通常,在某些情况下,当用户从主屏幕重新选择该任务时,系统会清除该任务(从根活动之上的堆栈中删除所有活动)。通常,如果用户在一定时间内(比如30分钟)没有访问该任务,就会执行此操作。

这似乎对我很管用:

adb shell am kill <package_name>

这与OP中提到的adb shell kill不同。

注意,am kill命令的帮助是这样说的:

am kill: Kill all processes associated with <PACKAGE>.  Only kills.
  processes that are safe to kill -- that is, will not impact the user
  experience.

因此,如果进程在前台,它不会终止进程。这似乎可以作为OP想要的工作,如果我导航离开我的应用程序,然后运行adb shell am kill <package_name>它将杀死应用程序(我已经确认使用设备上的ps)。然后,如果我返回到应用程序,我就回到了我之前在的活动中-即在OP的例子中,进程被重新创建并创建ActivityD(而不是ActivityC,像大多数其他杀死方法一样触发)。

抱歉我迟到了几年,但希望其他人会觉得这有用。

用HOME键把应用程序放在后台

在Android Studio中选择“Logcat”模式的进程,然后单击左下角的“终止应用程序”

现在在Android设备上启动你的应用程序


编辑:根据互联网,以下也适用:

 adb shell am kill [my-package-name]

来自未来的编辑:需要注意的是,在Android Studio 4.0中有一个变化,如果你使用从AS运行,那么终止将发出一个强制停止。

然而,如果你随后从启动器启动,然后你尝试以这种方式模拟它,然后你会得到你想要的结果(低内存行为)。

按下Home键,把应用程序放在后台。然后从DDMS或ADB停止或终止该进程。

以编程的方式在应用程序后台运行,然后发出ADB命令:

adb shell am kill <PACKAGE_NAME>

请注意,这与Wajahat Karim的一篇优秀文章中描述的adb shell kill命令不同:https://wajahatkarim.com/2020/03/defending-your-app/

请注意,这与adb shell kill命令不同。该命令杀死你的应用程序的整个进程,如终止应用程序按钮,而adb shell am kill只杀死安全的进程,以重新分配资源,如内存,CPU等。