我想知道:当一个应用程序要被杀死时,Android 是等待当前正在运行的函数返回,还是 Android 会在它自行结束之前停止它?
7 回答
更新: 经过测试,Android会杀死当前正在运行的任何线程/AsynTask(不调用onPostExecute()/onCancelled());
如果您正常关闭应用程序。您的 ui-thread 停止,但如果您在 Thread / AsyncTask / Service 中实现您的方法,它将继续运行直到完成。
但是,如果您有应用程序实例的回调或对应用程序的 ui 执行某些操作,您的 Thread / AsyncTask 可能会继续运行,但可能会或可能不会完全正常运行。根据正在执行的操作,这可能会给您一个例外。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new Thread(new Runnable() {
@Override
public void run() {
try {
int i = 0;
while (true) {
i++;
Thread.sleep(2000);
Log.i("not dead", "not dead" + i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
运行这段代码,然后去玩一些游戏。结果是线程将被系统杀死。
操作系统杀死 JVM 进程,所有线程中的所有“功能”。实际上,您不应该假设方法是事务。相反,应该假设它可以随时终止并进行适当的设计。
您的应用程序可能随时被系统杀死,而无需执行另一行代码。然而,根据文档,有一些方法不是“可杀死”的:
- onCreate()
- onRestart()
- 开始()
- onResume()
- 暂停()
由于 onDestroy() 肯定不会被调用,因此使用onPause()方法将任何持久性数据写入存储更节省:
protected void onPause(){
super.onPause();
if(isFinishing()){
// store data
}
}
它会在执行过程中杀死一个方法是有道理的。考虑到许多“挂起”是由于单个方法循环中的无限循环条件造成的。操作系统如何杀死这样的应用程序而不在执行方法的过程中杀死它?
还要考虑这一点:即使操作系统允许“当前”方法在终止应用程序之前完成执行,然后终止应用程序,它也会在调用操作系统的第一个方法的方法中间终止应用程序允许继续执行直到完成。好的,那么继续这个想法到极致。如果操作系统允许正在执行的每个函数在杀死应用程序之前完成,那么最终结果是操作系统允许整个应用程序运行完成,这正是杀死应用程序应该规避的。因此,操作系统在杀死一个应用程序时,必须在“一个”......实际上是“许多”......功能的中间终止它。调用堆栈上的每个函数都没有机会完成!
Android 可以在任何时候、任何时候杀死你的应用程序。但是如果他有足够的资源或者你有前台活动或服务,android 会尝试让你的应用程序运行。
在杀死您的应用程序之前,android 将根据 SDK 文档调用组件的生命周期方法。并非所有生命周期方法都保证被调用。
每个 android 应用都运行在一个单独的 Dalvik VM 上。当 android 杀死该应用程序时,它会破坏该 VM 实例。并且不关心您正在使用的线程或它们在做什么,您可以通过创建一个 tcp 服务器套接字轻松测试这一点,该套接字将阻塞直到客户端连接然后终止应用程序,没有任何反应,没有中断异常引发或任何事情,因为VM实例本身被杀死。
这真的取决于杀戮的方法。撞车致死?所有线程都停止在它们所在的位置。由于看门狗定时器而杀死?无论他们在哪里,所有线程都被杀死。由于用户关闭活动而被杀?活动/线程将完成他们正在做的事情。基本上,你不能指望它,但它可能会发生。如果您担心由于关闭而导致数据损坏,则需要使用事务模型。