PACKAGE_ADDED BroadcastReceiver不起作用

int*_*_32 9 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>
Run Code Online (Sandbox Code Playgroud)

和接收器:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

当我手动或从Android Market安装APK时,没有收到任何内容.为什么?

and*_*per 28

在安装其他应用程序之前,您是否运行了包含此broadcastReceiver的应用程序?

从某个API版本开始,在您执行应用程序之前,broadcastReceivers将无法运行.放置一个活动并执行它.

另外,不要忘记将以下内容添加到broadcastReceiver中:

<data android:scheme="package" />
Run Code Online (Sandbox Code Playgroud)

编辑:在Android 8及更高版本中,如果您的应用程序针对的是API 27或更高版本,它将部分工作,因此您必须在代码中而不是在清单中注册这些事件.以下是清单中仍可安全使用的意图列表:https://developer.android.com/guide/components/broadcast-exceptions.html.

其余的应该用在代码中.更多信息在这里

  • 谢谢,将<data android:scheme ="package"/>添加到intent-filter中它就可以了! (3认同)
  • @Sagar这是很久以前写的。在 Android 8 及更高版本上,如果您的应用程序面向 API 27 或更高版本,它将部分工作,因此您必须在代码中而不是在清单中注册这些事件。以下是在清单中仍然可以安全使用的意图列表:https://developer.android.com/guide/components/broadcast-exceptions.html。其余的应该在代码中使用。更多信息在这里:https://developer.android.com/about/versions/oreo/background.html#broadcasts (2认同)

小智 9

从 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)
Run Code Online (Sandbox Code Playgroud)

  • 就我而言,我从代码中注册了这些意图,但实际上没有添加数据方案。在我按照这个答案添加它之后,它立即开始工作:intentFilter.addDataScheme(“package”) (2认同)

Pao*_*lli 8

由于android.intent.action.PACKAGE_ADDED是系统意图(请注意,您自己的应用程序在安装时不会收到它),您的BroadcastReceiver将从您应用程序外部的来源接收消息.因此,检查你没有把:android:exported ="false"

您还可能需要添加:

<data android:scheme="package" />
Run Code Online (Sandbox Code Playgroud)

所以,你的广播接收器在你的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>
Run Code Online (Sandbox Code Playgroud)

如果它仍然不起作用,您可以尝试放置更高的优先级,例如:android:priority ="1000"

请查看:http://developer.android.com/guide/topics/manifest/receiver-element.html


Sav*_*sis 5

您是否尝试在正在安装的应用程序中接收意图?ACTION_PACKAGE_ADDED的文档说:

请注意,新安装的软件包不会收到此广播.

另一种可能性是,这种意图可能不会被传递给通过清单注册的组件,而只能手动传递(如Mark Murphy对Stack Overflow问题的答案所述,无法接收PACKAGE意图的广播).