0

假设我想receiver为我自己的小部件定义一个,并且我希望它org.test.mywidget.MY_ACTION与系统广播一起处理我自己的广播APPWIDGET_xxx ,如果我希望它仅在从相同的应用程序包?我尝试了以下 XML 代码,但通过这种方式,该APPWIDGET_DELETE操作不再传递给小部件提供程序:

    <receiver
        android:name="MyWidgetProvider">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/my_widget_info" />
    </receiver>
    <receiver
        android:name="MyWidgetProvider"
        android:exported="false">
        <intent-filter>
            <action android:name="org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE" />
        </intent-filter>
    </receiver>

上面的 XML 有我提到的问题(没有传递 DELETED 事件),而且对我来说似乎也不好,因为重新定义了接收器。所以我将所有内容压缩如下:

    <receiver
        android:name="MyWidgetProvider">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            <action android:name="org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/my_widget_info" />
    </receiver>

这可行APPWIDGET_UPDATEAPPWIDGET_DELETE 我自己的广播都已交付,但现在我有一个问题:现在其他应用程序是否能够将带有操作的广播意图交付org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE给我的小部件,因为该android:exportedtrue默认设置为?也许我错过了一些与这个导出值相关的基本概念,所以如果你们中的一些人能让我更好地理解一切,我会很高兴:)

4

1 回答 1

0

如果我希望它仅在从同一个应用程序包发送的情况下处理我自己的广播?

如果操作字符串全部包含在您自己的包中,则您不需要,甚至不需要操作字符串。只需使用将IntentJava 类对象作为第二个参数的构造函数,并使用它来发送要被接收者接收的广播。

我尝试了以下 XML 代码,但通过这种方式,APPWIDGET_DELETE 操作不再传递给小部件提供程序

那是因为在您的代码中没有<intent-filter>引用该操作字符串。

现在其他应用程序是否能够通过操作 org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE 向我的小部件传递广播意图,因为 android:exported 值默认设置为 true?

是的。当然,第三方应用程序可以发送APPWIDGET_UPDATE广播,甚至Intent可以直接破解识别您的组件的内容,您也会收到这些。

我怀疑在你的情况下,正确的答案是简单地实现第二个BroadcastReceiver,一个没有 no<intent-filter>的,它处理你只想在你的包中的操作。或者,如果您不需要为此使用 a PendingIntent,请从 Android 支持包中BroadcastReceiver考虑。LocalBroadcastManager

于 2012-07-31T16:53:47.007 回答