我有这样的服务(这不是实际的服务,只是为了描述我的问题)。
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怎么知道它应该停止我的线程?
感谢您的回答。
答案 0 :(得分:1)
当您从菜单中选择强制停止时,Android会终止发现附加到您的应用类加载器的任何内容。在Linux上思考kill -9
。任何onDestroy方法都没有很好的回调,系统只会结束一切。
现在为您服务:
while(true)
应该从不使用。它会立即杀死电池,并且无论如何都不会在99%的时间内完成任何工作。
您所在的区域已经使用了接收器,您可以将while
逻辑放入其中,一旦上传完成,请拨打下一个上传,依此类推。完全不需要循环。