Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当Android重新启动服务时,Android服务中启动的线程会发生什么情况?_Android_Multithreading_Service_Ondestroy - Fatal编程技术网

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

当Android重新启动服务时,Android服务中启动的线程会发生什么情况?,android,multithreading,service,ondestroy,Android,Multithreading,Service,Ondestroy,我有一个这样的服务(这不是实际的服务,只是为了描述我的问题) 然后它启动了服务,但当我将我的应用程序移动到后台并打开任务管理器(android 4.2.2)并关闭该应用程序时,android重新启动了我的服务,我可以看到它创建了一个全新的实例,我可以看到onDestroy从未为以前的服务实例调用过。我还可以看到前一个处理器线程的实例不再运行。这怎么可能?如果onDestroy从未被调用,Android怎么知道它应该停止我的线程 感谢您的回答。当您从菜单中选择“强制停止”时,Android将删除任

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

然后它启动了服务,但当我将我的应用程序移动到后台并打开任务管理器(android 4.2.2)并关闭该应用程序时,android重新启动了我的服务,我可以看到它创建了一个全新的实例,我可以看到onDestroy从未为以前的服务实例调用过。我还可以看到前一个处理器线程的实例不再运行。这怎么可能?如果onDestroy从未被调用,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
}