ACTION_MY_PACKAGE_REPLACED未收到

我正在使用ACTION_MY_PACKAGE_REPLACED来接收我的应用程序更新或resinstalled。 我的问题是,事件是从来没有触发(我试过Eclipse和真正的设备)。 这就是我所做的:

performance:

<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。 谢谢。

Related of "ACTION_MY_PACKAGE_REPLACED未收到"

由于某种原因,Google开发者(名为“Dianne Hackborn”)认为可以单独注册到当前应用程序的PACKAGE_REPLACED意图(链接在这里 )。

然而,我找不到任何正确的方式,所以我做了一个妥协:它将使用最新的API时,可用。

可悲的是,我找不到为什么它不能被debugging,但它确实工作(如果你愿意,你可以写入日志)。

这是代码:

performance:

  <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 /值/ 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 /值-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 Studio 1.0+,如此处所示。 完全基于android开发人员的答案 ,我解决了以下实现的问题:

AndroidManifest.xml中:

 <receiver android:name=".UpdateReceiver$LegacyUpdateReceiver" android:enabled="@bool/shouldUseActionPackageReplaced" > <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package" /> </intent-filter> </receiver> <receiver android:name=".UpdateReceiver" android:enabled="@bool/shouldUseActionMyPackageReplaced" > <intent-filter> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> </intent-filter> </receiver> 

/res/values/resources.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <bool name="shouldUseActionPackageReplaced">true</bool> <bool name="shouldUseActionMyPackageReplaced">false</bool> </resources> 

/res/values-v12/resources.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <bool name="shouldUseActionPackageReplaced">false</bool> <bool name="shouldUseActionMyPackageReplaced">true</bool> </resources> 

UpdateReceiver.java:

 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class UpdateReceiver extends BroadcastReceiver { public static class LegacyUpdateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent != null && intent.getData() != null && context.getPackageName().equals(intent.getData().getSchemeSpecificPart())) { onUpdate(context); } } } @Override public void onReceive(Context context, Intent intent) { onUpdate(context); } public static void onUpdate(Context context) { Log.d("LOG", "Current app updated"); } } 

从所有用户那里获得信息,我可以用这种方式解决我的情况。 他们都是对的,很less有人注意到:

在清单中:

  <receiver android:name=".MyEventReceiver" > <intent-filter android:priority="1000" > <!--other actions I need--> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package"/> </intent-filter> </receiver> 

和代码:

 public class MyEventReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(Intent.ACTION_PACKAGE_REPLACED.equals(intent.getAction())) { if(intent.getData().getSchemeSpecificPart().equals(context.getPackageName())) { //Restart services. } } } } 

在我的Android版本(2.3姜饼)我没有能够使用MY_PACKAGE_REPLACED,但我们解决使用PACKAGE_REPLACED(将build议任何应用程序已被replace),但询问是否是我们的:

  if(intent.getData().getSchemeSpecificPart().equals(context.getPackageName())) { } 

谢谢大家

你在API> = 12设备/模拟器上试试吗? 这个广播将不会在以前的情况下发送,因为它是API 12.如果您需要您的应用程序来接收Pre-ICS和旧的蜂巢式设备,

尝试:

 if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) { if (!intent.getData().getSchemeSpecificPart() .equals(context.getPackageName())) { return; } } 

我只是想在这里添加我自己的两便士,因为我有问题得到这个工作和debugging..我正在使用棒棒糖设备:

这是我使用的代码:

  <receiver android:name=".services.OnUpdateReceiver"> <intent-filter> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> </intent-filter> </receiver> 

为了进行debugging,您需要确保您已经在手机上安装了更新,只需通过Eclipse进行debugging就可以了,并且至less打开了一次应用程序,然后您可以简单地编辑您的debuggingconfiguration:

 eclipse > run > debug configurations > launch action (do nothing) > then F11 like normal 

我确认这是通过写一个小文件到SD卡的工作

简单的清单在所有版本中工作:

  <receiver android:name=".Receiver" android:enabled="true" android:exported="true" > <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.MY_PACKAGE_REPLACED" /> </intent-filter> </receiver> 

您需要将数据scheme添加到意向filter,如下所示

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