APK更新杀死前台服务 - 报告为崩溃

时间:2017-11-20 10:20:23

标签: android service

场景是:

  • 我的应用程序正在使用活动的前台服务运行。
  • 我选择重新安装或升级我的应用。
  • 系统将强制退出应用,包括服务。
  • 系统现在会报告我的服务已崩溃。
  • 系统取代应用程序。
  • 我的应用已安装并可以启动并运行,并根据需要再次启动前台服务。

有没有办法避免系统在杀死前台服务时报告崩溃?

正在运行的应用程序永远不会收到任何退出挂钩类型信息,只是消失了。我没办法 stopForeground ,这样操作系统就不会对服务的消失感到惊讶。

这是否仅适用于任何前台服务?我不是Spotify或其他东西,但我认为这样的应用必须时不时地遇到这个问题?

我很感激任何专家对这个主题的见解,以及如果有的话,可以做些什么。我的企业应用程序(各种各样)在每次升级时看到崩溃时都会惹恼QA。

澄清更新:

各种PACKAGE_ *意图通知应用程序正在安装,更新或删除的其他应用程序。他们没有告诉应用程序被替换即将发生。

还有一个MY_PACKAGE_REPLACED意图可以告诉您有关更新的信息。但它通知新安装的版本安装是更新。

1 个答案:

答案 0 :(得分:0)

  

我无法使用stopForeground,因此操作系统不会因服务的消失而感到惊讶。

您可以使用ACTION_MY_PACKAGE_REPLACED

  

广播操作:已安装新版本的应用程序   在现有的。这只发送给那个应用程序   更换。它不包含任何其他数据;接受它,只是   使用意图过滤器来执行此操作。

<强> [编辑] 我做了一个小小的研究 - 我做的是,
创建了一个类 -

public class InstallReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Timber.e("onReceive() %s", intent.getAction());
    }
}

在manifest.xml中注册了接收者

<receiver
            android:name=".receivers.InstallReceiver"
            android:enabled="true"
            android:exported="true">

            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_INSTALL" />
                <action android:name="android.intent.action.PACKAGE_ADDED" />
                <action android:name="android.intent.action.PACKAGE_CHANGED" />
                <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
            </intent-filter>
</receiver>

...当我重新安装具有相同版本的应用程序(通过ADB运行应用程序)时,广播被调用,这是Logcat中的结果:

E/InstallReceiver: onReceive() android.intent.action.MY_PACKAGE_REPLACED

[编辑2]
如果您想在应用程序被替换之前知道, 我想没有办法! 而且您不必担心它如果更换了应用程序,则系统将终止该过程。没有其他特殊的东西可以执行!!

了解更多信息Follow this question