【问题标题】:PACKAGE_ADDED BroadcastReceiver doesn't workPACKAGE_ADDED 广播接收器不起作用
【发布时间】:2020-12-08 00:18:41
【问题描述】:

我在 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 安装时,什么也没有收到。为什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    <data android:scheme="package" />
    

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

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

    【讨论】:

    • 谢谢,将 添加到 intent-filter 中,它可以工作了!
    • @android 开发者,谢谢,但是在 DDMS 视图中删除应用程序时 PACKAGE_REMOVED 仍然存在问题。您有什么建议
    • 它仍然对我不起作用。我的意图过滤器中有多个操作。其中,PACKAGE_FULLY_REMOVED 正确触发了我的接收器的 onCreate,但是,PACKAGE_ADDED 根本没有。我的应用程序已经处于运行状态,我已经为接收器 export="true" 并且根据您的建议包含了 。我在这里错过了什么吗?
    • @Sagar 这是很久以前写的。在 Android 8 及更高版本上,如果您的应用针对 API 27 或更高版本,它将部分工作,因此您必须在代码中而不是在清单中注册这些事件。以下是清单中仍然可以安全使用的意图列表:developer.android.com/guide/components/…。其余的应该在代码中使用。更多信息在这里:developer.android.com/about/versions/oreo/…
    • 谢谢@androiddeveloper,帮了大忙。
    【解决方案2】:

    由于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

    【讨论】:

    • 文档中提到,最大优先级可以是999 developer.android.com/guide/topics/manifest/…
    • 出于某种原因,它仍然对我不起作用。我的意图过滤器中有多个操作。其中,PACKAGE_FULLY_REMOVED 正确触发了我的接收器的 onCreate,但是,PACKAGE_ADDED 根本没有。我的应用程序已经处于运行状态,我已经为接收器 export="true",我将最大优先级设置为 999,并且根据您的建议,我已经包含了 。我在这里错过了什么吗?
    【解决方案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)
    

    【讨论】:

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

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

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

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

    【讨论】:

    • 当我尝试接收此意图时,带有接收器的应用程序已启动
    【解决方案5】:

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

    (正如@Savvas 所指出的)如果您尝试接收自己添加的包裹,则无法接收。即使你的广播接收者有action.PACKAGE_ADDED,接收者的onReceive方法isn't triggered

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

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-13
        • 2017-10-12
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        相关资源
        最近更新 更多