如果我的应用程序在后台,doInBackground仍然可以运行吗?

时间:2013-07-10 17:05:13

标签: android asynchronous

我有一个启动器样式应用程序,您可以在其中启动另一个应用程序。当该应用程序启动时,我希望我的应用程序记录一些事情,基本上记录时间等。

所以我有一段代码,其结构基本上如下所示:

appSelectedListener{
    runSelectedApp;
    private class Background extends AsyncTask<Void, Void, Void>{
        protected void doInBackground(){
            //executable code
        }
    }
}

只有那些线条,我很抱歉,如果代码关闭但我实际上没有写任何东西我只想先处理这些东西。我的问题是,当所选应用程序被带到前台时,我的应用程序会转到后台。 doInBackground()中的可执行代码是否仍然可以运行?或者我的应用程序是否必须在前台?

2 个答案:

答案 0 :(得分:2)

  

doInBackground()中的可执行代码是否仍在运行?

一般。您分叉的线程的行为不会立即受前景/背景考虑因素的影响。

最终,您的后台应用程序的流程将被终止,为其他应用程序释放内存,或者因为用户请求终止该进程。此时,所有后台线程(以及RAM中的所有其他线程)都会消失。如果您的AsyncTask尚未doInBackground(),则在这种情况下将不会调用doInBackground()

答案 1 :(得分:1)

澄清一下:说doInBackground()“在后台运行”有点用词不当。它在UI线程的单独线程上运行,但与应用程序的其余部分在同一进程中运行(除了您在单独进程中运行的任何组件)。 UI线程是最高优先级,Android系统采取措施确保其他线程和进程不会干扰它。

当事件导致新活动的UI线程优先时,所有其他 UI 线程都会暂停。其他非UI线程可能会也可能不会继续,具体取决于各种因素。

另外,请记住,当用户更改设备的方向时,Android的默认行为是调用onDestroy()跟随活动的onCreate()方法。这将破坏AsyncTask对象,该对象会破坏用于异步工作的非UI线程,这实际上取消了doInBackground()中代码的执行。

出于这个原因,你应该使用AsyncTask做一些你不介意重复的简短操作,如果它们在完成之前被取消了。长时间运行的操作(例如从服务器下载)应该由IntentService或同步适配器完成。

相关问题