1

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

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 */));
        }

    }

}

我的问题是,如果我在我的应用程序中做这样的事情:

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

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

感谢您的回答。

4

1 回答 1

1

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

现在为您服务:

while(true)真的应该使用。它会立即耗尽电池,并且无论如何 99% 的时间都不会做任何工作。

你已经在使用接收器,你可以把你的while逻辑放在那里,一旦上传完成,就调用下一次上传,依此类推。绝对不需要循环。

于 2013-10-13T08:47:33.743 回答