2013-10-13 69 views
0

我有这样的服务(这不是实际的服务,它只是为了描述我的问题)。当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 */)); 
     } 

    } 

} 

而我的问题是,如果我做我的应用程序是这样的:

​​

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

感谢您的回答。

+0

正如meredrica所述,如果你强制停止一个应用程序,这个过程实际上只是被杀死,一切都从内存中扯下来。这就是为什么Android在尝试执行时会提供警告的原因,即通常的正常关机不会发生,并且不会调用任何生命周期方法。顺便说一句,这也是为什么任务杀手应用程序是邪恶的,违背了Android的设计原则。 – Squonk

回答

0

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

现在为您服务:

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

您所在的地区已经在使用接收器,您只需将您的while逻辑放入此处,一旦上传完成,再调用下一个上传等。循环绝对没有必要。