当前位置: 首页 > 知识库问答 >
问题:

区分清单中的隐式广播接收器与显式广播接收器

刘骏祥
2023-03-14

根据谷歌提供的AndroidO迁移指南,大部分隐含的广播意图不应该在清单中注册(除了这里发现的一些例外),但显式广播意图保持不变。

我们希望将任何需要的广播从舱单上移开。但我们如何识别接收者是否是隐性的呢?有一般规则吗?

下面是我们在清单中注册的广播示例。我们是否应该只查看“action”标记,并查看它是否被列入白名单以将其保留在清单中?

<receiver
    android:name=".receiver.ImageBroadcastReceiver"
    android:enabled="true" >
    <intent-filter>
        <action android:name="android.hardware.action.NEW_PICTURE" />
        <category android:name="android.intent.category.OPENABLE" />
        <data android:mimeType="image/*" />
    </intent-filter>
</receiver>

<receiver
    android:name=".receiver.InstallReferrerReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
</receiver>

<receiver android:name=".receiver.JoinEventReceiver" >
    <intent-filter>
        <action android:name="JOIN_ACTION" />
        <action android:name="CANCEL_ACTION" />
        <action android:name="DECLINE_ACTION" />
    </intent-filter>
</receiver>

例如,“com.android.vending.INSTALL\u referer”意图没有被列入白名单。我们应该在活动中注册它吗?如果是这样的话,当我们注册应用程序时,它不会被触发吗?当我试图理解广播接收器是隐式的还是显式的时,这让我感到困惑,因为我认为我只需要检查“action”标签。

共有1个答案

荆弘伟
2023-03-14

但我们如何识别接收者是否是隐性的呢?

如果Intent具有ComponentName,则Intent是显式的。否则,它是隐含的。

ComponentName可以通过以下几种方式之一获得:

>

  • 它可以直接放在Intent上(例如,新Intent(这就是Wesomereceiver.class

    使用PackageManagerquerytentReceivers()根据动作字符串等找到正确的接收者后,可以直接将其放在Intent上。

    它可以由系统从操作字符串等加上通过setPackage()定义的包派生出来。

    我们应该只看“操作”标签,看看它是否被白名单以保留在清单中吗?

    没有。你还需要考虑广播的性质:它是去任何注册的接收器,还是只去特定的应用程序?

    例如,“com.android.vending.INSTALL\u referer”意图没有被列入白名单。我们应该在活动中注册它吗?

    不会。该广播将只发送到最近安装的应用程序,因此它必须是明确的意图。动作字符串等用于帮助系统确定哪个注册接收者是相关接收者。

    将其与ACTION_PACKAGE_ADDED进行对比。这是广播给任何注册的接收器;它不仅仅是一个特定的应用程序。因此,Intent必须是隐式的(否则它将具有标识特定应用中的特定接收器的ComponentName)。而且,由于ACTION_PACKAGE_ADDED不在白名单上,假设您不能在Android 8.0的清单中注册此广播。

  •  类似资料:
    • 问题内容: 有人可以解释和之间的确切区别吗? 在什么情况下我们必须使用每个Receiver类? 问题答案: 和之间只有一个区别。 当您收到内部广播方法时, 假设, BroadcastReceiver : 它 不保证 该 CPU将保持清醒 ,如果你启动一些长时间运行的进程。CPU可能会立即回到睡眠状态。 WakefulBroadcastReceiver : 这是 保证 该 CPU将保持清醒 ,直到你

    • 我需要一些帮助来理解当我可以期望我的广播接收器在清单中注册时工作,而不是必须从正在运行的活动或服务中注册。 因此,例如,如果我用以下意图筛选器注册了一个独立的接收器,那么它在没有对它的服务/活动引用的情况下就能正常工作: 但是,如果将替换为,则不会触发接收器(Android文档) 从我在这个站点上发现的,你必须从一个已经运行的活动或服务中注册这个接收器,以使其工作(Post)。 > 有人能告诉我,

    • 本文向大家介绍Android中的广播和广播接收器代码实例,包括了Android中的广播和广播接收器代码实例的使用技巧和注意事项,需要的朋友参考一下 BroadcastReceiver不仅可以接收系统广播,也可接收自定义的广播   1.定义一个广播接收器   2.发送广播,定义好action标志,用Intent发送 3.注册只接收指定action的广播接收器 4.取消该广播接收器

    • 4.2.1.3 内部广播接收器 内部广播接收器是广播接收器,它将永远不会收到从内部应用以外发送的任何广播。 它由几个内部应用组成,用于保护内部应用处理的信息或功能。 要点(接收广播): 定义内部签名权限来接收广播。 声明使用内部签名权限来接收结果。 将导出属性显式设置为true。 需要静态广播接收器定义的内部签名权限。 需要内部签名来注册动态广播接收器。 确认内部签名权限是由内部应用定义的。 尽管

    • 4.2.1.2 公共广播接收器 公共广播接收器是可以从未指定的大量应用程序接收广播的广播接收器,因此有必要注意,它可能从恶意软件接收广播。 要点(接收广播): 将导出属性显式设为true。 小心并安全地处理收到的意图。 返回结果时,不要包含敏感信息。 公共广播接收器的示例代码可以用于静态和动态广播接收器。 PublicReceiver.java package org.jssec.android.

    • 4.2.1.1 私有广播接收器 私人广播接收器是最安全的广播接收器,因为只能接收到从应用内发送的广播。 动态广播接收器不能注册为私有,所以私有广播接收器只包含静态广播接收器。 要点(接收广播): 将导出属性显示设为false 小心并安全地处理收到的意图,即使意图从相同的应用中发送 敏感信息可以作为返回结果发送,因为请求来自相同应用 AndroidManifest.xml <?xml version