我的应用运行的服务会在设备重新启动或重新安装(更新)应用时终止。我添加了两个广播接收器来捕获这些事件 - BOOT_COMPLETED和ACTION_MY_PACKAGE_REPLACED。
ACTION_MY_PACKAGE_REPLACED接收器似乎不起作用。这就是我所拥有的:
的AndroidManifest.xml:
<receiver android:name=".RebootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<receiver android:name=".ReInstallReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_MY_PACKAGE_REPLACED"/>
</intent-filter>
</receiver>
RebootReceiver:
public class RebootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Logg.d("Reboot completed. Restarting service");
context.startService(new Intent(context, MyService.class));
}
}
ReInstallReceiver:
public class ReInstallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Logg.d("App Upgraded or Reinstalled. Restarting service");
context.startService(new Intent(context, MyService.class));
}
}
运行minSdk = 16;在运行KitKat的Galaxy S3上进行测试。通过检查我的服务是否在“设置/应用程序”中运行来测试成功,它在重新启动时执行,但不重新安装。
我考虑了以下注释,其中说在Android Studio 1.0+中,清单合并意味着我无法将两个接收器合并为一个类。请参阅ACTION_MY_PACKAGE_REPLACED not received和Android manifest merger fails for receivers with same name but different content
答案 0 :(得分:16)
您可能已经想到了这一点,但是清单中的操作名称是错误的,而不是:
android.intent.action.ACTION_MY_PACKAGE_REPLACED
应该是
android.intent.action.MY_PACKAGE_REPLACED
您还可以使用adb shell
手动触发接收器以进行测试:
adb shell am broadcast -a android.intent.action.MY_PACKAGE_REPLACED -n com.example.myapp/.ReInstallReceiver
答案 1 :(得分:4)
考虑到:
答案 2 :(得分:3)
我想用一个新的答案来更新此线程,因为我发现没有帖子提供适用于Android 7.0+的更新解决方案,而该Intent
受到了保护。
转到Build -> Build APK
,并记下.apk的存储位置。
然后,在终端中运行:
adb install -r debugapp.apk
这将触发MY_PACKAGE_REPLACED
的意图,因为较新的Android SDK仅允许系统对其进行广播。