android - 未收到 ACTION_MY_PACKAGE_REPLACED

标签 android broadcastreceiver

我正在使用 ACTION_MY_PACKAGE_REPLACED 来接收我的应用程序更新或重新安装的时间。 我的问题是该事件从未被触发(我尝试了 Eclipse 和真实设备)。 我就是这样做的:

list :

<receiver android:name=".MyEventReceiver" >
    <intent-filter android:priority="1000" >
        <action android:name="android.intent.action.ACTION_MY_PACKAGE_REPLACED" />
    </intent-filter>
</receiver>

代码:

public class MyEventReceiver extends BroadcastReceiver
{  
   @Override public void onReceive(Context context, Intent intent)
   {  
      if ("android.intent.action.ACTION_MY_PACKAGE_REPLACED".equals(intent.getAction())) 
      {  //Restart services
      }
   }      
}

这段代码很简单,实际上我使用了其他事件,例如 BOOT_COMPLETED 和其他事件,它们可以工作,但 ACTION_MY_PACKAGE_REPLACED。 谢谢。

最佳答案

出于某种原因,一位谷歌开发人员(名为“Dianne Hackborn”)认为可以单独注册到当前应用程序的 PACKAGE_REPLACED Intent(阅读存档版本 here ,原始链接 here )。

但是,我找不到任何正确的方法,所以我做出了妥协:它将在可用时使用最新的 API。

遗憾的是,我不知道为什么它不能被调试,但它确实有效(如果你愿意,你可以写入日志)。

代码如下:

list :

    <receiver
        android:name=".OnUpgradeBroadcastReceiver"
        android:enabled="@bool/is_at_most_api_11" >
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REPLACED" />
            <data android:scheme="package" />
        </intent-filter>
    </receiver>
    <receiver
        android:name=".OnUpgradeBroadcastReceiver"
        android:enabled="@bool/is_at_least_api_12" >
        <intent-filter>
            <action android:name="android.intent.action.MY_PACKAGE_REPLACED" />
        </intent-filter>
    </receiver>

res/values/version_checks.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <item name="is_at_least_api_12" type="bool">false</item>
    <item name="is_at_most_api_11" type="bool">true</item>

</resources>

res/values-v12/version_checks.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <item name="is_at_least_api_12" type="bool">true</item>
    <item name="is_at_most_api_11" type="bool">false</item>

</resources>

OnUpgradeBroadcastReceiver.java

public class OnUpgradeBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        if (VERSION.SDK_INT <= VERSION_CODES.HONEYCOMB
                && !context.getPackageName().equals(intent.getData().getSchemeSpecificPart())) {
            android.util.Log.d("AppLog", "other apps were upgraded");
            return;
        }
        android.util.Log.d("AppLog", "current app was upgraded");

编辑:在今天的 Android 版本中,当你应该将 minSdk 设置为至少 14 时,你不需要这个,实际上你应该只使用 MY_PACKAGE_REPLACED 就可以了。不需要 bool 值等...

关于android - 未收到 ACTION_MY_PACKAGE_REPLACED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666734/

相关文章:

java - 在 Android 应用程序中运行 C 代码 (Android Studio)

android - 什么优化是安全的,仍然允许 -assumenosideeffects 去除

Android:当字段可见性更改为 GONE 时更改 XML 中的焦点顺序

java - 取消具有不同上下文的警报

java - 如何在代码中使用 picasso 设置背景图像

安卓天文台

Android - 我可以将 Wifi 状态更改的 Intent 发送给服务吗?

java - Android 短信接收器无法使用

java - 当用户离线时显示对话框并在用户在线时关闭它(使用广播接收器)

android - android应用程序可以只有广播接收器和没有 Activity 的服务吗