代码之家  ›  专栏  ›  技术社区  ›  Gauthier

在清单中区分隐式广播接收器和显式广播接收器

  •  28
  • Gauthier  · 技术社区  · 9 年前

    根据谷歌提供的Android O迁移指南,大多数隐含的广播意图不应该在清单中注册(除了少数发现的例外情况) here

    这是我们在清单中注册的广播示例。我们是否应该只查看“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>
    

    1 回复  |  直到 8 年前
        1
  •  43
  •   CommonsWare    9 年前

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

    如果 Intent 有一个 ComponentName 是明确的。否则,它是隐含的。

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

    • 它可以直接放在 意图 new Intent(this, TheReallyAwesomeReceiver.class )

    • 它可以直接放在 意图 使用后 PackageManager queryIntentReceivers()

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

    我们是否应该只查看“action”标签,并查看它是否被列入白名单以将其保留在清单中?

    任何

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

    不会。该广播只会发送到最近安装的应用程序,因此它必须是显式的 意图

    将其与 ACTION_PACKAGE_ADDED . 广播给任何注册接收器;它不仅仅是一个特定的应用程序。因此 必须是隐式的(否则它将具有 组件名称 添加了ACTION\u PACKAGE\u

    推荐文章