2

これでBroadcastReceiverを実行することができました:

<receiver
        android:name=".AlarmReceiver"
        android:enabled="true"
        android:exported="false">
</receiver>

あなたが見ることができるように<intent-filter>Intent適切なエクストラで正しく呼び出されます。しかし、私は周りを見回していて、必要かどうかについて混乱していますか?私はsetAction()自分のメソッドを呼び出していますがIntent、実際にはそのアクションの文字列を使用せずに、通知に関する特定の問題を確実にするために他のメソッドとは異なるものにします。しかし、相関関係は正確には何ですか?前もって感謝します。

Intent intent = new Intent(this.getContext(), AlarmReceiver.class);
        intent.setAction("com.something"+System.currentTimeMillis());
        //... extras are here
        PendingIntent pi = PendingIntent.getBroadcast(this.getContext(), 123, intent, PendingIntent.FLAG_CANCEL_CURRENT|Intent.FILL_IN_DATA);
AlarmManager alarm = (AlarmManager)getContext().getSystemService(Activity.ALARM_SERVICE);
        alarm.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pi);

マニフェストファイルにあるものでそれを使用すると機能します。

編集 私はこれをAndroidDevelopersブログで見つけました、そしてそれはこれを述べています:


暗黙的インテントは、アクション、カテゴリ、データ、MIMEタイプなどを使用して、一致する「対象」のみを指定します。それらが見つける正確なコンポーネントは、実行時にのみ、パッケージマネージャーが現在のアプリケーションと照合することによって決定されます。

明示的インテントは、ComponentNameを介して、一致する必要がある単一の明示的な「誰」を指定します。インテントに他に何があるかに関係なく、ComponentNameで指定された正確なマニフェストパッケージ名とクラス名にのみ関連付けられます。


私はまだこの説明と少し混乱していますが、それは私がすべきことに最も近いことのようです。したがって、暗黙のインテントを使用していると確信しています。質問は、私が省略しても大丈夫<intent-filter>ですか?特定のクラスに合わせています。それらを結びつける実際の行動はないかもしれませんが、それ自体はクラスで十分ですか?

4

2 に答える 2

4

<intent-filter>暗黙的なインテントを使用してレシーバーを起動する場合に必要です。ブロードキャストレシーバーを起動するために常に明示的なインテントを使用している場合は、インテントフィルターは必要ありません。

このSO投稿を参照してください。

于 2012-07-18T01:00:43.043 に答える
-1

ブロードキャストレシーバーが機能する全体的な方法は、システム内で送信される特定のブロードキャストインテントをキャッチするためにインテントフィルターを使用することです。したがって、レシーバーにインテントフィルターを指定しない場合、レシーバーには何も送信されず、そのコードは実行されません。

Intentのドキュメントを読み、IntentがIPCを許可する方法を学習してください。

アップデート

また、宣言がないと、すべてのパブリックブロードキャストと、コードがそれを処理する方法を受信する可能性があります。気になるものを除くすべてのブロードキャストを無視します。私は標準に従っているので、この種の実装を行ったことがありません。これは、動的リスナー(Programatic)または静的リスナー(XML宣言)のいずれかとして宣言することであり、動的リスナーのインテントフィルターはコードで設定されます。

于 2012-07-18T00:51:47.237 に答える