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_UPDATE自分APPWIDGET_DELETE のブロードキャストはすべて配信されますが、質問があります。値がデフォルトで に設定されorg.test.mywidget.FORCE_SMALL_WIDGET_UPDATEているため、他のアプリがアクションを含むブロードキャスト インテントをウィジェットに配信できるようになりましたか? このエクスポートされた値に関連するいくつかの基本的な概念が欠けている可能性があります。android:exportedtrue

4

1 に答える 1

0

同じアプリ パッケージから送信された場合にのみ、自分のブロードキャストを処理したい場合は?

すべてが独自のパッケージ内にある場合は、アクション文字列は必要ありません。Intent2 番目のパラメーターとして Java クラス オブジェクトを受け取るコンストラクターを使用し、それを使用してブロードキャストを送信し、受信側で取得します。

次の XML コードを試しましたが、この方法では APPWIDGET_DELETE アクションがウィジェット プロバイダーに配信されなくなりました。

これは<intent-filter>、コード内でそのアクション文字列を参照していないためです。

Android:exported の値がデフォルトで true に設定されているため、他のアプリはアクション org.test.mywidget.FORCE_SMALL_WIDGET_UPDATE を使用してブロードキャスト インテントを配信できるようになりましたか?

はい。もちろん、サードパーティのアプリはAPPWIDGET_UPDATEブロードキャストを送信したり、コンポーネントを直接識別するハッキングを行ったりIntentすることができ、それらも受信します.

あなたの場合、正しい答えは、あなたがパッケージ内に入れたいだけの操作を処理する、BroadcastReceiverno のない2 番目の を単に実装することだと思います。または、このに<intent-filter>を使用する必要がない場合は、Android サポート パッケージから検討してください。PendingIntentBroadcastReceiverLocalBroadcastManager

于 2012-07-31T16:53:47.007 に答える