如何让我的应用程序在安装或删除其他应用程序时接收广播

我想制作一个应用程序,可以接收广播时,设备上的其他应用程序安装或删除。

我的代码

在不言而喻:

<receiver android:name=".apps.AppListener"> <intent-filter android:priority="100"> <action android:name="android.intent.action.PACKAGE_INSTALL"/> <action android:name="android.intent.action.PACKAGE_ADDED"/> <action android:name="android.intent.action.PACKAGE_REMOVED"/> </intent-filter> </receiver> 

在AppListener中:

 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; public class AppListener extends BroadcastReceiver { @Override public void onReceive(Context context, Intent arg1) { // TODO Auto-generated method stub Log.v(TAG, "there is a broadcast"); } } 

但我不能收到任何广播。 我认为这个问题是由于应用程序的权限,任何想法?

感谢您的帮助。

Solutions Collecting From Web of "如何让我的应用程序在安装或删除其他应用程序时接收广播"

在你的清单中:

 <receiver android:name=".apps.AppListener"> <intent-filter android:priority="100"> <action android:name="android.intent.action.PACKAGE_INSTALL"/> <action android:name="android.intent.action.PACKAGE_ADDED"/> <action android:name="android.intent.action.PACKAGE_REMOVED"/> </intent-filter> </receiver> 

在intent-filter标签之前添加行

 <data android:scheme="package"/> 

所以你的清单应该是这样的:

 <receiver android:name=".apps.AppListener"> <intent-filter android:priority="100"> <action android:name="android.intent.action.PACKAGE_INSTALL"/> <action android:name="android.intent.action.PACKAGE_ADDED"/> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package"/> </intent-filter> </receiver> 

我不确定PACKAGE_REMOVED的意图,如果它实际上是可用的。

您必须消除android.intent.action.PACKAGE_INSTALL,因为它已被弃用,不再推荐,因为它只是为了系统。 一切都是完美的,我会build议,而不是100,把999,文件没有给最大或最小数量使用,数字越大,更高的优先级将有你的接收器的意图。 对不起,翻译。 我用西class牙语讲话和写作。 信息

 <receiver android:name=".apps.AppListener"> <intent-filter android:priority="999"> <action android:name="android.intent.action.PACKAGE_ADDED"/> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <data android:scheme="package"/> </intent-filter> 

很好的答案,只剩下一件小事:

在每个App更新中,首先调用ACTION_PACKAGE_REMOVED,然后再调用ACTION_PACKAGE_ADDED-如果您想忽略这些事件,只需将它添加到onReceive()中:

 if(!(intent.getExtras() != null && intent.getExtras().containsKey(Intent.EXTRA_REPLACING) && intent.getExtras().getBoolean(Intent.EXTRA_REPLACING, false))) { //DO YOUR THING } 

这是从文档:

EXTRA_REPLACING在API级别3中添加String EXTRA_REPLACING在ACTION_PACKAGE_REMOVED意图中用作布尔额外字段,以表明这是包的replace,所以此广播之后将立即为不同版本的相同包添加广播。 常量值:“android.intent.extra.REPLACING”