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

时间:2015-07-22 18:58:21

标签: android

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

因此,当应用程序在Play商店中更新时,该服务将被终止,但UI可能无法再次打开(所以我猜服务也不会再次启动)。这对我来说不好,因为服务执行核心应用程序的功能。 我该如何克服这个问题?

非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

是的,每个应用都会在更新期间被杀死 - 请参阅我的回答here

您可以将服务作为STICKY服务,这项服务在被杀时重新启动。来自docs

  

public static final int START_STICKY   在API级别5中添加

     

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

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

  1. 实现虚拟数据库并覆盖 SQLiteOpenHelper.html onUpgrade() 。只要有新的数据库版本,就会调用onUpgrade()方法已安装。有关详情,请访问refer here
  2. 现在,每当您有一个应用程序的新更新时,也会更新数据库版本。这样,您将在数据库版本和应用程序版本之间进行一对一的映射。
  3. 现在,当用户更新应用程序 onUpgrade() 时,您可以编写您想要跟踪更新的任何逻辑。(如果您使用的是数据库)应用程序,您可能需要一些额外的逻辑来区分实际的数据库升级和应用程序升级。)

答案 1 :(得分:0)

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

在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);
        }
    }
}