我想知道:当一个应用程序要被杀死时,Android会等待当前正在运行的函数返回,还是Android会在它自行结束之前停止它?
答案 0 :(得分:4)
<强>更新强> 经过测试,Android将终止当前正在运行的任何线程/ AsynTask(不调用onPostExecute()/ onCancelled());
如果您正常关闭应用程序。您的ui线程停止,但如果您在Thread / AsyncTask / Service中实现您的方法,它将继续运行直到它完成。
但是,您的Thread / AsyncTask可能会继续运行,但如果您对应用程序实例进行回调或对应用程序的ui执行某些操作,则可能会也可能不会完全正常运行。这可能会给你一个异常,具体取决于正在做什么。
@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();
}
跑完这段代码,去玩一些游戏。结果是线程将被系统杀死。
答案 1 :(得分:4)
操作系统杀死所有线程中的所有“功能”的JVM进程。实际上,您不应该假设方法是一个事务。相反,人们应该假设它可以随时终止并进行适当的设计。
答案 2 :(得分:3)
您的应用可能会被系统杀死,而不会执行其他代码行。然而,根据documentation,有一些方法不是“可杀”的:
因为onDestroy()不会被调用,所以使用 onPause()方法将任何持久数据写入存储更加省事:
protected void onPause(){
super.onPause();
if(isFinishing()){
// store data
}
}
答案 3 :(得分:2)
Android可以随时杀死您的应用。但是,如果Android为其提供了资源,或者如果您有前台活动或服务,那么它会尝试让您的应用继续运行。
在杀死你的app之前,android会根据SDK文档调用组件的生命周期方法。并非所有生命周期方法都被保证被调用。
答案 4 :(得分:2)
每个Android应用程序都在一个单独的Dalvik VM上运行。当android杀死该应用程序时,它会销毁该VM实例。并且不关心您正在使用的线程或它们正在做什么,您可以通过创建一个tcp服务器套接字来轻松测试,该套接字将阻塞直到客户端连接然后终止应用程序,没有任何反应,没有中断异常引发或因为VM实例本身被杀死了。
答案 5 :(得分:1)
它会在执行中杀死一个方法。考虑到许多&#34;挂起&#34;是由于单个方法循环中的无限循环条件。操作系统如何在执行方法的过程中杀死这样的应用程序而不杀死它?
还要考虑这一点:即使操作系统允许&#34;当前&#34;在杀死应用程序之前完成执行的方法,然后杀死应用程序,它将在方法中间杀死应用程序,该方法调用了操作系统允许继续执行的第一个方法,直到完成为止。好的,那么继续这种想法到极致。如果操作系统允许执行中间的每个函数在杀死应用程序之前完成,那么最终结果是操作系统允许整个应用程序运行完成,这正是杀死应用程序应该绕过的。因此,操作系统在杀死应用程序时,必须在&#34; a&#34; ... acutally&#34; many&#34; ....功能中间终止它。在callstack上的每个函数都没有机会完成!
答案 6 :(得分:1)
这实际上取决于杀人的方法。因撞车而致死?所有线程都停在哪里。看门狗计时器杀人?所有线程都被杀死了。由于用户关闭活动而被杀?活动/线程将完成他们正在做的事情。基本上,你不能指望它,但它可能会发生。如果您担心因关闭而导致数据损坏,则需要使用事务模型。