Android: 广播 ACTION_MY_PACKAGE_REPLACED 从未收到
Android: Broadcast ACTION_MY_PACKAGE_REPLACED never received
我的应用程序运行的服务在设备重启或应用程序重新安装(更新)时终止。我添加了两个广播接收器来捕获这些事件 - 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>
重启接收器:
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));
}
}
重新安装接收器:
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;在 Galaxy S3 运行 KitKat 上进行测试。通过检查我的服务在 Settings/Applications 中是否为 运行 来测试成功,它会在重新启动时执行,但不会重新安装。
我已经考虑了以下注释,其中指出在 Android Studio 1.0+ 中,明显的合并意味着我无法将两个接收器合并为一个 class。参见 ACTION_MY_PACKAGE_REPLACED not received and Android manifest merger fails for receivers with same name but different content
您可能已经想到了这一点,但是您在清单中的操作名称是错误的,而不是:
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
考虑到:
- 您的应用程序的新版本
- 你应该 运行 adb install -r 你的新版本 apk,如果你 运行
在 Android Studio 不会收到此广播
我想用一个新的答案更新这个话题,因为我发现没有帖子提供 Android 7.0+ 的更新解决方案,其中 Intent
现在受到保护。
转到 Build -> Build APK
,并记下 .apk 的存储位置。
然后,运行 在终端中:
adb install -r debugapp.apk
这将触发 MY_PACKAGE_REPLACED
意图,因为更新的 Android SDK 只允许系统广播它。
我的应用程序运行的服务在设备重启或应用程序重新安装(更新)时终止。我添加了两个广播接收器来捕获这些事件 - 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>
重启接收器:
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));
}
}
重新安装接收器:
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;在 Galaxy S3 运行 KitKat 上进行测试。通过检查我的服务在 Settings/Applications 中是否为 运行 来测试成功,它会在重新启动时执行,但不会重新安装。
我已经考虑了以下注释,其中指出在 Android Studio 1.0+ 中,明显的合并意味着我无法将两个接收器合并为一个 class。参见 ACTION_MY_PACKAGE_REPLACED not received and Android manifest merger fails for receivers with same name but different content
您可能已经想到了这一点,但是您在清单中的操作名称是错误的,而不是:
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
考虑到:
- 您的应用程序的新版本
- 你应该 运行 adb install -r 你的新版本 apk,如果你 运行 在 Android Studio 不会收到此广播
我想用一个新的答案更新这个话题,因为我发现没有帖子提供 Android 7.0+ 的更新解决方案,其中 Intent
现在受到保护。
转到 Build -> Build APK
,并记下 .apk 的存储位置。
然后,运行 在终端中:
adb install -r debugapp.apk
这将触发 MY_PACKAGE_REPLACED
意图,因为更新的 Android SDK 只允许系统广播它。