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。
这个问题很老了,但是,这个问题的答案不需要adb, Android Studio等。唯一的要求是API 23或更新版本。
为了模拟应用程序由操作系统重新启动,当你的应用程序正在运行时,进入应用程序设置,禁用(然后你可以启用)一个权限,并从最近的应用程序返回应用程序。当权限被禁用时,操作系统杀死应用程序,但保留保存的实例状态。当用户返回应用程序时,应用程序和最后一个活动(保存状态)被重新创建。
“无后台进程”方法有时会导致相同的行为,但并不总是如此。例如,如果应用程序正在运行后台服务,“无后台进程”不做任何事情。但是应用程序可以被系统杀死,包括它的服务。权限方法工作,即使应用程序有一个服务。
例子:
我们的应用程序有两个活动。ActivityA是从启动器启动的主活动。ActivityB是从ActivityA开始的。我将只显示onCreate, onStart, onStop, onDestroy方法。Android总是在调用onStop之前调用onSaveInstanceState,因为处于停止状态的活动可以被系统杀死。[https://developer.android.com/reference/android/app/Activity.html ActivityLifecycle]
许可的方法:
<start app from launcher first time>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
<open ActivityB>
ActivityB onCreate WITHOUT savedInstance
ActivityB onStart
ActivityA onStop (the order is like this, it is stopped after new one is started)
<go settings>
ActivityB onStop
<disable a permission>
//Application is killed, but onDestroy methods are not called.
//Android does not call onDestroy methods if app will be killed.
<return app by recent apps>
Application onCreate (this is the important part. All static variables are reset.)
ActivityB onCreate WITH savedInstance (user does not notice activity is recreated)
//Note that ActivityA is not created yet, do not try to access it.
ActivityB onStart
<return ActivityA by back>
ActivityA onCreate WITH savedInstance (user does not notice activity is recreated)
ActivityA onStart
ActivityB onStop
ActivityB onDestroy
<press back again, return launcher>
ActivityA onStop
ActivityA onDestroy
<open app again>
//does not call Application onCreate, app was not killed
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
我想比较其他答案中提到的其他方法。
不保留活动:这不会杀死应用程序。
<start app from launcher first time>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
<open ActivityB>
ActivityB onCreate WITHOUT savedInstance
ActivityB onStart
ActivityA onStop
ActivityA onDestroy (do not keep)
<return launcher by home button>
ActivityB onStop
ActivityB onDestroy (do not keep)
<retun app from recent apps>
// NO Application onCreate
ActivityB onCreate WITH savedInstance (user does not notice activity recreated)
ActivityB onStart
<return ActivityA by back>
ActivityA onCreate WITH savedInstance (user does not notice activity recreated)
ActivityA onStart
ActivityB onStop
ActivityB onDestroy
<press back again, return launcher>
ActivityA onStop
ActivityA onDestroy
<open app again>
//does not call Application onCreate, app was not killed
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
强制停止方法:不存储已保存的实例状态
<start app from launcher first time>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
ActivityA onStart
<open ActivityB>
ActivityB onCreate WITHOUT savedInstance
ActivityB onStart
ActivityA onStop
<go settings>
ActivityB onStop
<force stop, return app from recent apps>
Application onCreate
ActivityA onCreate WITHOUT savedInstance
//This is important part, app is destroyed by user.
//Root activity of the task is started, not the top activity.
//Also there is no savedInstance.