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

Android 当安卓停止一个应用程序时,一个功能可以中途停止吗?,android,Android,我想知道:当一个应用程序被终止时,Android是在等待当前运行的功能返回,还是在它自行结束之前停止它?更新: 测试后,Android将杀死当前正在运行的任何线程/AsynTask(不调用onPostExecute()/onCancelled()) 如果您正常关闭应用程序。ui线程停止,但如果在线程/异步任务/服务中实现方法,它将继续运行,直到完成为止。 但是,线程/异步任务可能会继续运行,但如果您回调了应用程序实例或对应用程序的ui执行了某些操作,则可能无法完全正常工作。根据正在执行的操作,

我想知道:当一个应用程序被终止时,Android是在等待当前运行的功能返回,还是在它自行结束之前停止它?

更新: 测试后,Android将杀死当前正在运行的任何线程/AsynTask(不调用onPostExecute()/onCancelled())

如果您正常关闭应用程序。ui线程停止,但如果在线程/异步任务/服务中实现方法,它将继续运行,直到完成为止。
但是,线程/异步任务可能会继续运行,但如果您回调了应用程序实例或对应用程序的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();
}

运行此代码,然后去玩一些游戏。结果是线程将被系统终止。

在执行过程中终止方法是有意义的。考虑到许多“挂起”是由于在单个方法的循环中的无限循环条件。否则,在执行一个方法的过程中,OS会如何杀死这样的应用程序而不杀死它?


也可以这样考虑:即使OS允许“当前”方法在杀死应用程序之前完成执行,然后杀死应用程序,它将在方法的中间杀死应用程序,该方法被称为OS允许继续执行的第一个方法,直到它完成为止。好吧,那么继续这个想法到极致吧。如果操作系统允许在执行过程中执行的每一个功能在杀死应用程序之前完成,那么最终的结果是OS允许整个应用程序运行到完成,这正是杀死一个应用程序应该避免的。因此,一个操作系统,当杀死一个应用程序,必须终止它在“A”的中间…实际上“很多”。。。。功能。调用堆栈上的每个函数都没有机会完成

Android可以在任何时间、任何地点杀死你的应用程序。但如果安卓有足够的资源,或者你有前台活动或服务,他会努力让你的应用程序运行


在终止应用程序之前,android将根据SDK文档调用组件的生命周期方法。并非所有生命周期方法都保证被调用

操作系统杀死JVM进程,所有线程中都有“函数”。实际上,您不应该假设一个方法是一个事务。相反,我们应该假设它可以在任何时候终止,并进行适当的设计。

每个android应用程序都在单独的Dalvik VM上运行。当android杀死那个应用程序时,它就会摧毁那个VM实例。不管您正在使用的线程或它们在做什么,您都可以轻松地测试这一点,通过创建一个tcp服务器套接字,该套接字将阻止客户端连接,然后终止应用程序,不会发生任何事情,也不会引发中断异常或其他任何事情,因为VM实例本身被终止。

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

您的应用程序可能随时被系统杀死,而不会执行另一行代码。然而,根据《世界卫生组织》的说法,有几种方法不是“可杀死的”:

  • onCreate()
  • onRestart()
  • onStart()
  • onResume()
  • onPause()
由于onDestroy()肯定不会被调用,因此使用onPause()方法将任何持久性数据写入存储器更容易保存:

protected void onPause(){
   super.onPause();
   if(isFinishing()){
      // store data
   }
}

不确定Android杀死应用程序时是否会出现这种情况。当用户离开它时,是的,但是如果Android杀死它(例如为了释放内存),我认为它会毁掉整个事情。我不知道正在进行的方法会发生什么,我想知道。我会在测试后更新答案,但电池会在2分钟内耗尽。唤醒锁会发生什么?Android会在应用程序关闭时释放其持有的唤醒锁吗?@Ralgha:在文档中很难找到任何东西。推测一下,如果操作系统没有为应用程序提供健壮的终止挂钩,它会有什么选择?如果某些应用程序在运行后无法清理,该怎么办?一个选项是由操作系统进行清理。其他的是什么?那将是一场无休止的等待游戏。正在执行的函数是另一个函数的一半。它基本上必须等到程序完成,这超出了杀戮的目的。