在 Android 应用更新后保留后台服务

7

我的后台服务执行着应用的核心功能,当用户界面被打开时首先启动。

因此,当应用在Play商店更新时,该服务会被终止,但是用户界面可能不会再次打开(因此我猜测服务也不会重新启动)。这对我来说很糟糕,因为该服务执行着应用的核心功能。如何解决这个问题?

非常感谢任何帮助。


请先将您的应用程序相关代码添加到问题中。 - TDG
你尝试将你的服务放在另一个进程中了吗? - Murillo Ferreira
我认为我的应用程序代码在这里并不相关。因为这适用于任何通用服务。 - abhilash poojary
我相信是的,但我从未关注过这个问题。在onStartCommand中,你的返回值是什么?Service.START_REDELIVER_INTENT会重新启动应用程序并重新发送第一次启动时传递给它的意图,当你的服务被操作系统杀死时。 - Murillo Ferreira
我使用 start_sticky。理想情况下,这也应该启动服务,对吗? - abhilash poojary
显示剩余2条评论
2个回答

6

您的服务将在升级期间被终止。您需要捕获升级事件并重新启动它。

在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>

在UpgradeReceiver.java文件中。
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);
        }
    }
}

3

是的,每个应用程序在更新期间都会被终止-请参阅我的答案这里

您可以将服务设置为STICKY服务,这些服务在被杀死时会重新启动。从文档中了解:

public static final int START_STICKY Added in API level 5

从onStartCommand(Intent,int,int)返回:如果在启动此服务(从onStartCommand(Intent,int,int)返回后)时杀死了该服务的进程,则将其保留在已启动状态但不保留此传递的意图。稍后系统将尝试重新创建服务。因为它处于已启动状态,所以它将保证在创建新服务实例后调用onStartCommand(Intent,int,int);如果没有任何待处理的启动命令要传递到服务,则使用空意图对象调用它,因此您必须小心检查这一点。

您可以尝试的其他方法是检测应用程序更新并再次启动服务。要检测应用程序更新,您可以监听PACKAGE_INSTALL广播或使用以下解决方法:

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

Service.START_REDELIVER_INTENT 重新传递用于启动它的意图,这可能是更好的方法,但取决于每种情况。 - Murillo Ferreira
我的返回值已经是START_STICK了。所以理想情况下,服务将在更新后重新启动? - abhilash poojary
是的,它应该重新启动。 - rupesh jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接