1

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

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

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

仅这些行,如果代码关闭,我很抱歉,但我实际上没有写任何东西,但我只想先处理这些东西。My question is, when the selected app is brought to the foreground, my app goes to the background. doInBackground() 中的可执行代码是否仍然可以运行?还是我的应用程序必须在前台?

4

2 回答 2

2

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

通常。您分叉的线程的行为不会立即受到前台/后台注意事项的影响。

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

于 2013-07-10T17:08:03.587 回答
1

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

当一个事件导致新活动的 UI 线程获得优先权时,所有其他UI线程都会暂停。其他非 UI 线程可能会或可能不会继续,这取决于各种因素。

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

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

于 2013-07-10T17:23:49.563 回答