我想创建一个可以在安装或删除设备上的其他应用时接收广播的应用。
我的代码
在表现中:
<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");
}
}
但我无法接收任何广播。我认为这个问题是由于应用程序权限,任何想法?
感谢您的帮助。
答案 0 :(得分:44)
在你的清单中:
<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意图,如果它实际可用。
答案 1 :(得分:19)
您必须消除 android.intent.action.PACKAGE_INSTALL ,因为它已弃用且不再推荐,因为它仅适用于系统。其他一切都很完美,我建议使用999而不是100,文档没有给出最大或最小数量,数字越大,优先级越高,你的接收者就会有这个意图。对不起翻译。我用西班牙语说和写。 Information
<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>
答案 2 :(得分:7)
很棒的答案,只留下一件小事:
在每次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中添加字符串EXTRA_REPLACING用作 ACTION_PACKAGE_REMOVED意图中的布尔额外字段表示 这是一个包的替代品,所以这个广播会 紧接着是另一个版本的添加广播 相同的包裹。 常数值:&#34; android.intent.extra.REPLACING&#34;