我有一个在Manifest中注册的广播接收器:
<application ...>
<receiver android:name="com.some.pkg.NewAppReceiver" >
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
</intent-filter>
</receiver>
</appcication>
接收者:
public class NewAppReceiver extends BroadcastReceiver {
private static final String TAG = "NewAppReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "Intent: " + intent.getAction());
}
}
我手动或APK安装Android Market时未收到任何内容。为什么呢?
答案 0 :(得分:24)
在安装其他应用之前,您是否运行了包含此broadcastReceiver的应用程序?
从某个API版本开始,在您执行应用程序之前,broadcastReceivers将无法运行。放置一个活动并执行它。
另外,不要忘记将以下内容添加到broadcastReceiver中:
<data android:scheme="package" />
编辑:在Android 8及更高版本上,如果您的应用针对的是API 27或更高版本,它将部分工作,因此您必须在代码中而不是在清单中注册这些事件。以下是清单中可以安全使用的意图列表:https://developer.android.com/guide/components/broadcast-exceptions.html。
其余部分应该在代码中使用。更多信息here
答案 1 :(得分:8)
由于android.intent.action.PACKAGE_ADDED是系统意图(请注意,您自己的应用在安装时不会收到它),因此您的BroadcastReceiver会从应用外部的来源收到消息。因此,检查你没有把: android:exported =“false”
您可能还需要添加:
<data android:scheme="package" />
因此, BroadcastReceiver 中的AndroidManifest.xml应如下所示:
<application ...>
<receiver android:name=".NewAppReceiver" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
</appcication>
如果仍然无效,您可以尝试提高优先级,例如: android:priority =“1000”
看看:http://developer.android.com/guide/topics/manifest/receiver-element.html
答案 2 :(得分:5)
您是否尝试在正在安装的应用程序中接收意图? The documentation for ACTION_PACKAGE_ADDED说:
请注意,新安装的软件包不会收到此广播。
另一种可能性是,这种意图可能不会传递给通过清单注册的组件,而只能手动传递(如an answer by Mark Murphy to Stack Overflow question Can't receive broadcasts for PACKAGE intents中所述)。
答案 3 :(得分:3)
从清单中注册接收者将无法从API 26(android 8)运行。因为它会对较旧的版本产生性能影响。
但是我们可以从Java代码注册接收器,并接收已删除和已添加应用程序的更新。
val intentFilter = IntentFilter()
intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED)
intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED)
intentFilter.addDataScheme("package")
registerReceiver(YourBroadcastReceiver(), intentFilter)
答案 4 :(得分:0)
如果您尝试接收其他包裹,则必须使用它。
(正如@Savvas所说)如果你试图收到自己的包裹,你就无法收到它。即使您的广播接收器具有action.PACKAGE_ADDED
,接收方的onReceive
方法isn't triggered。
在这种情况下,最好的办法就是保存这些数据。通过使用sharedPreferences
,添加类似“appIsWorkedBefore”的键,并在启动器Activity的onCreate方法上将此变量设置为“true”。你可以根据这个布尔值进行工作。
答案 5 :(得分:0)
此意图操作不再适用于应用程序。
dict
https://developer.android.com/reference/android/content/Intent#ACTION_PACKAGE_ADDED