当Android重新启动服务时,Android服务中启动的线程会发生什么情况?
我有一个这样的服务(这不是实际的服务,只是为了描述我的问题) 然后它启动了服务,但当我将我的应用程序移动到后台并打开任务管理器(android 4.2.2)并关闭该应用程序时,android重新启动了我的服务,我可以看到它创建了一个全新的实例,我可以看到onDestroy从未为以前的服务实例调用过。我还可以看到前一个处理器线程的实例不再运行。这怎么可能?如果onDestroy从未被调用,Android怎么知道它应该停止我的线程当Android重新启动服务时,Android服务中启动的线程会发生什么情况?,android,multithreading,service,ondestroy,Android,Multithreading,Service,Ondestroy,我有一个这样的服务(这不是实际的服务,只是为了描述我的问题) 然后它启动了服务,但当我将我的应用程序移动到后台并打开任务管理器(android 4.2.2)并关闭该应用程序时,android重新启动了我的服务,我可以看到它创建了一个全新的实例,我可以看到onDestroy从未为以前的服务实例调用过。我还可以看到前一个处理器线程的实例不再运行。这怎么可能?如果onDestroy从未被调用,Android怎么知道它应该停止我的线程 感谢您的回答。当您从菜单中选择“强制停止”时,Android将删除任
感谢您的回答。当您从菜单中选择“强制停止”时,Android将删除任何附加到应用程序类加载器的内容。想想Linux上的kill-9。对于任何onDestroy方法都不会有很好的回调,系统只会结束一切 现在为您服务:
while(true)
确实应该永远不要使用。它会立即耗尽电池,并且在99%的时间里不会做任何工作
你已经使用了接收器,你可以把你的
while
逻辑放到那里,一旦上传完成,调用下一次上传,依此类推。完全不需要循环。当您从菜单中选择“强制停止”时,Android将删除它找到的连接到应用程序类加载器的任何内容。想想Linux上的kill-9。对于任何onDestroy方法都不会有很好的回调,系统只会结束一切
现在为您服务:
while(true)
确实应该永远不要使用。它会立即耗尽电池,并且在99%的时间里不会做任何工作
你已经使用了接收器,你可以把你的
while
逻辑放到那里,一旦上传完成,调用下一次上传,依此类推。完全不需要循环。正如meredrica所说,如果你强制停止一个应用程序,进程就会被终止,所有内容都会从内存中被删除。这就是为什么Android在您尝试这样做时会提供警告,也就是说,通常的正常关机不会发生,并且不会调用任何生命周期方法。另一方面,这也是为什么任务杀手应用程序是邪恶的,并且违背了Android的设计原则。正如meredrica所说,如果你强制停止一个应用程序,整个过程实际上就是被杀死的,所有的东西都会从内存中被掏空。这就是为什么Android在您尝试这样做时会提供警告,也就是说,通常的正常关机不会发生,并且不会调用任何生命周期方法。另一方面,这也是为什么任务杀手应用程序是邪恶的,并且违背了Android的设计原则。
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
}