当Android重新启动服务时,在Android服务中启动的线程会发生什么?

时间:2013-10-13 07:34:32

标签: android multithreading service ondestroy

我有这样的服务(这不是实际的服务,只是为了描述我的问题)。

public class UploadService {

    private BlockingQueue<UploadData> queue = null;

    private UploadInfoReceiver receiver = null;

    public void onStart(...) {
        queue = new LinkedBlockingQueue<UploadData>();
        (new Processor()).start();
        // creating and reigtering receiver
    }

    public void onDestroy() {
        queue.add(new ServiceDestroyedData());
        // unregistering the receiver
    }

    private class Processor extends Thread() {

        public void run() {
            while (true) {
                UploadData data = queue.take();

                if (data instanceof ServiceDestroyedData) {
                    return;
                }

                // processing data
            }
        }

    }

    private class UploadInfoReceiver extends BroadcastReceiver {

        public void onReceive(Context context, Intent intent) {
            queue.add(new UploadData(/* getting data from intent */));
        }

    }

}

我的问题是,如果我在我的App中做了类似的事情:

if (!isUploadServiceRunning()) {
    // start the Service
}

然后它启动服务,但是当我将我的应用程序移动到后台并打开任务管理器(android 4.2.2)并杀死应用程序时,Android重新启动我的服务,我可以看到它创建了一个全新的实例它,我可以看到onDestroy永远不会被调用上一个Service实例。而且我也可以看到前一个处理器线程的实例不再运行。怎么会这样?如果onDestroy永远不会被调用,Android怎么知道它应该停止我的线程?

感谢您的回答。

1 个答案:

答案 0 :(得分:1)

当您从菜单中选择强制停止时,Android会终止发现附加到您的应用类加载器的任何内容。在Linux上思考kill -9。任何onDestroy方法都没有很好的回调,系统只会结束一切。

现在为您服务:

while(true)应该从不使用。它会立即杀死电池,并且无论如何都不会在99%的时间内完成任何工作。

您所在的区域已经使用了接收器,您可以将while逻辑放入其中,一旦上传完成,请拨打下一个上传,依此类推。完全不需要循环。