重新安装/更新应用程序正在运行的服务会发生什么?

时间:2011-12-28 21:04:37

标签: android service install

我需要在正在运行的服务线程中进行数据库清理。在正常情况下,这将在服务完成并且调用onDestroy()时发生。

我注意到如果我在服务运行时重新安装或更新应用程序,则不会为服务调用onDestroy()。无论如何,我的应用程序可以在下次启动时知道它是重新安装后的第一次运行,因此它可以在数据库上完成一些清理工作吗?

澄清一下,只是再次运行服务将无法满足我的需求。在许多情况下,我的服务是由广播接收者而不是活动本身启动的,因此我不能依赖onPause作为主要活动。我无法弄清楚如何知道服务是否已经在运行或者是否已经被静默杀死并且需要清理。

我想澄清,因为其他人似乎误解了。首先,onDestroy只是在重新安装或更新应用程序的情况下不会发生。由于未卸载应用程序,因此共享首选项也不会重置。其次,谷歌明确表示你不能依赖onDestroy,因此请求我寻找快速解决方案,而不是要求谷歌为什么onDestroy不起作用也没有意义。请参阅有关活动的onDestroy的API文档。服务文档不重复该警告,但显然它是正确的。我迄今发现的唯一可行解决方案是我在另一个StackOverflow线程中发布的解决方案。

1 个答案:

答案 0 :(得分:0)

啊哈,我在这里找到答案: How to check if a service is running on Android?

这个小片段。只需将当前上下文传递给它,所以如果来自BroadcastReceiver传递给定onReceive的上下文...例如,我可以在服务启动时设置一个全局变量,并在onDestroy中清除它。当我的应用程序启动时,如果设置了变量,我可以测试该服务当前是否正在运行,如果没有,那么我可以进行清理。

private boolean isMyServiceRunning(Context context) {
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if ("com.myapp.myservice".equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}