PACKAGE_ADDED BroadcastReceiver不起作用

时间:2012-06-04 21:40:54

标签: android broadcastreceiver android-4.0-ice-cream-sandwich

我有一个在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时未收到任何内容。为什么呢?

6 个答案:

答案 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)