22

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

我的代码

在清单中:

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

但我无法接收任何广播。我认为这个问题是由于应用程序权限,知道吗?

感谢您的帮助。

4

3 回答 3

46

在您的清单中:

<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 的意图是否真的可用。

于 2012-06-28T14:08:28.027 回答
21

您必须消除android.intent.action.PACKAGE_INSTALL因为它已被弃用且不再推荐,因为它仅适用于系统。其他一切都很完美,我建议不要使用 100,而是使用 999,文档没有给出使用的最大或最小数量,数字越大,接收器的优先级就越高。对不起翻译。我用西班牙语说话和写作。 信息

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

于 2012-08-22T07:21:27.520 回答
8

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

在每次应用更新时,首先会调用 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 中添加 字符串 EXTRA_REPLACING 用作 ACTION_PACKAGE_REMOVED 意图中的布尔额外字段,以指示这是对包的替换,因此此广播之后将立即为同一包的不同版本添加广播。常量值:“android.intent.extra.REPLACING”

于 2017-02-13T18:34:49.373 回答