【发布时间】:2013-01-14 17:37:42
【问题描述】:
我想知道:当一个应用程序要被杀死时,Android 是等待当前正在运行的函数返回,还是在它自己结束之前停止它?
【问题讨论】:
-
那将是一场无休止的等待游戏。正在执行的函数是另一个函数的一半。它基本上必须等到程序完成,这超出了杀戮的目的。
标签: android
我想知道:当一个应用程序要被杀死时,Android 是等待当前正在运行的函数返回,还是在它自己结束之前停止它?
【问题讨论】:
标签: android
更新: 经过测试,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();
}
运行这段代码,然后去玩一些游戏。结果是线程将被系统杀死。
【讨论】:
您的应用可能随时被系统终止,而无需执行另一行代码。然而,根据documentation,有一些方法不是“可杀死”的:
因为 onDestroy() 肯定不会被调用,所以使用 onPause() 方法将任何持久性数据写入存储更省:
protected void onPause(){
super.onPause();
if(isFinishing()){
// store data
}
}
【讨论】:
Android 可以随时终止您的应用。但是,如果 android 有足够的资源或者您有前台活动或服务,则 android 会尝试保持您的应用运行。
在杀死您的应用之前,android 将根据 SDK 文档调用组件的生命周期方法。并非所有生命周期方法都保证被调用。
【讨论】:
这真的取决于杀戮的方法。撞车致死?所有线程都停止在它们所在的位置。由于看门狗定时器而杀死?无论他们在哪里,所有线程都被杀死。由于用户关闭活动而被杀?活动/线程将完成他们正在做的事情。基本上,你不能指望它,但它可能会发生。如果您担心由于关闭而导致数据损坏,则需要使用事务模型。
【讨论】:
它会在执行过程中终止一个方法是有道理的。考虑到许多“挂起”是由于单个方法循环中的无限循环条件造成的。操作系统如何杀死这样的应用程序而不在执行方法的过程中杀死它?
还要考虑这一点:即使操作系统允许“当前”方法在终止应用程序之前完成执行,然后终止应用程序,它也会在调用第一个方法的方法中间终止应用程序操作系统允许继续执行直到完成。好的,那么继续这个想法到极致。如果操作系统允许正在执行的每个函数在杀死应用程序之前完成,那么最终结果是操作系统允许整个应用程序运行完成,这正是杀死应用程序应该规避的。因此,操作系统在杀死一个应用程序时,必须在“一个”......实际上是“许多”......功能的中间终止它。调用堆栈上的每个函数都没有机会完成!
【讨论】:
每个 android 应用都在单独的 Dalvik VM 上运行。当 android 杀死该应用程序时,它会破坏该 VM 实例。并且不关心您正在使用的线程或它们在做什么,您可以通过创建一个 tcp 服务器套接字轻松测试这一点,该套接字将阻塞直到客户端连接然后终止应用程序,没有任何反应,没有中断异常引发或任何事情,因为 VM 实例本身被杀死。
【讨论】:
操作系统杀死 JVM 进程,所有线程中的所有“功能”。实际上,您不应该假设方法是事务。相反,应该假设它可以随时终止并进行适当的设计。
【讨论】: