当Android杀死一个应用程序时,一个功能可以中途停止吗?

时间:2013-01-30 19:13:52

标签: android

我想知道:当一个应用程序要被杀死时,Android会等待当前正在运行的函数返回,还是Android会在它自行结束之前停止它?

7 个答案:

答案 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,有一些方法不是“可杀”的:

  • onCreate()
  • onRestart()
  • onStart()
  • 的onResume()
  • 的onPause()

因为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)

这实际上取决于杀人的方法。因撞车而致死?所有线程都停在哪里。看门狗计时器杀人?所有线程都被杀死了。由于用户关闭活动而被杀?活动/线程将完成他们正在做的事情。基本上,你不能指望它,但它可能会发生。如果您担心因关闭而导致数据损坏,则需要使用事务模型。