11

我在 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());
    }
}

当我手动或从Android Market安装APK时,什么也没有收到。为什么?

4

6 回答 6

31

您是否在安装其他应用程序之前运行了包含此广播接收器的应用程序?

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

另外,不要忘记将以下内容添加到广播接收器中:

<data android:scheme="package" />

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

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

于 2012-06-04T22:32:48.937 回答
8

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

您可能还需要添加:

<data android:scheme="package" />

因此,您的AndroidManifest.xml中的BroadcastReceiver应如下所示:

<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

于 2013-09-16T13:49:15.053 回答
6

从清单注册接收器不适用于 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)
于 2020-07-24T13:11:13.580 回答
4

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

注意新安装的包没有收到这个广播。

另一种可能性是,此意图可能不会传递给通过清单注册的组件,而只能手动传递(如Mark Murphy 对 Stack Overflow 问题Can't receive broadcasts for PACKAGE intents的回答中所述)。

于 2012-06-04T22:03:19.017 回答
0

如果您尝试接收其他包裹,它必须工作。

(正如@Savvas 所指出的)如果您尝试接收自己的包裹添加,您将无法接收它。即使您的广播接收器有action.PACKAGE_ADDED,接收器的onReceive方法也不会被触发

在这种情况下,您最好的选择是保存这些数据。通过使用sharedPreferences,添加一个类似“appIsWorkedBefore”的键,然后在启动器 Activity 的 onCreate 方法中将此变量设置为“true”。你可以根据这个布尔值来制作你的作品。

于 2013-11-13T15:45:24.890 回答
0

此意图操作不再可用于应用程序。

This is a protected intent that can only be sent by the system.

https://developer.android.com/reference/android/content/Intent#ACTION_PACKAGE_ADDED

于 2020-12-07T16:18:41.810 回答