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

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

我的代码

在不言而喻:

<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"); } } 

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

感谢您的帮助。

  • Android:检测另一个应用程序已经开始播放音频
  • 完成广播接收器的活动
  • 为什么proguard处理AndroidManifest.xml
  • 来自广播接收器的Toast消息
  • 奇怪的“收件人未注册”例外
  • ANR意向广播{act = android.intent.action.SCREEN_OFF flg = 0x50000010}
  • 如何调试BOOT_COMPLETE广播接收器的“Force Close”崩溃?
  • 什么是更高效的广播接收器或处理器?
  • 在你的清单中:

     <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”