场景是:
正在运行的应用程序永远不会收到任何退出挂钩类型信息,只是消失了。我没办法 stopForeground ,这样操作系统就不会对服务的消失感到惊讶。
这是否仅适用于任何前台服务?我不是Spotify或其他东西,但我认为这样的应用必须时不时地遇到这个问题?
我很感激任何专家对这个主题的见解,以及如果有的话,可以做些什么。我的企业应用程序(各种各样)在每次升级时看到崩溃时都会惹恼QA。
各种PACKAGE_ *意图通知应用程序正在安装,更新或删除的其他应用程序。他们没有告诉应用程序被替换即将发生。
还有一个MY_PACKAGE_REPLACED意图可以告诉您有关更新的信息。但它通知新安装的版本安装是更新。
答案 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