android应用更新后保留后台服务



我的后台服务执行我的应用程序的核心功能,并在UI打开时首先启动。

所以当应用程序在play store上更新时,服务被杀死,但UI可能不会再次打开(所以我猜服务也不会再次启动)。这对我来说很糟糕,因为服务执行应用程序的核心功能。我该如何克服这一点?

感谢您的帮助

您的服务将在升级过程中被终止。您需要捕获升级事件并重新启动。

Manifest.xml

<receiver android:name=".yourpackage.UpgradeReceiver" android:enabled="true" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MY_PACKAGE_REPLACED"/>
            </intent-filter>
        </receiver>

public class UpgradeReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            if (!Intent.ACTION_MY_PACKAGE_REPLACED.equals(intent.getAction()))
                return;
            // Start your service here. 
        } catch (Exception e) {
            Utils.handleException(e);
        }
    }
}

是的,每个应用程序都在更新期间被杀死-参考我的答案在这里

您可以将您的服务设置为STICKY服务,此服务在终止时重新启动。来自文档:

public static final int START_STICKY新增API level 5

从onStartCommand(Intent, int, int)返回的常量服务的进程在启动时被杀死(从onStartCommand(Intent, int, int)),然后让它保持在启动状态但是不要保留这个传递的意图。稍后系统将尝试重新创建服务。因为它处于启动状态,所以它会类创建后保证调用onStartCommand(Intent, int, int)新的服务实例;如果没有任何挂起的启动命令当交付给服务时,它将以空意图被调用对象,所以您必须仔细检查这个

你可以尝试的另一件事是检测应用程序更新并再次启动服务。要检测应用程序更新,您可以收听PACKAGE_INSTALL广播或使用以下解决方案:

  1. 实现一个虚拟数据库并覆盖SQLiteOpenHelper.htmlonUpgrade()。每当安装新的数据库版本时,就调用onUpgrade()方法。有关更多信息,请参阅此处
  2. 现在,每次你有一个新的应用程序更新…更新数据库版本。通过这种方式,你将在数据库版本和应用程序版本之间有一个对一个的映射。
  3. 现在当用户更新应用程序onUpgrade()被调用,你可以写任何你想要跟踪更新的逻辑。(如果你在应用程序中使用数据库,你可能需要一些额外的逻辑来区分实际的数据库升级和应用程序升级)

最新更新