1

私は私のマニフェストで私の受信機を宣言している:Android - マニフェストファイルにローカルブロードキャスト受信機を宣言できますか?

public class MyTestReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     String action = intent.getAction(); 
     if ("com.example.ACTION_TEST".equals(action)) { 

      Toast.makeText(context, "Test!", Toast.LENGTH_SHORT).show(); 

     } 

    } 
} 

しかし、私は私のアプリ内の他の場所からこのコードを実行します:

<receiver 
    android:name=".MyTestReceiver" 
    android:enabled="true" 
    android:exported="true"> 
    <intent-filter> 
     <action android:name="com.example.ACTION_TEST"/> 
    </intent-filter> 
</receiver> 

そして、ここでは私のMyTestReceiverクラスです

Intent intent = new Intent("com.example.ACTION_TEST"); 
LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 

...ローカル放送は受信されませんd(すなわち、トーストは示されていない)。

質問:

  1. それはマニフェスト内のローカル放送受信機を登録することは可能ですか?
  2. もしそうなら、地元の放送受信機を間違って宣言したことがありますか?
  3. ローカルブロードキャストレシーバをマニフェストで宣言できず、代わりにApplicationサブクラスで宣言すると、マニフェストで宣言された受信者と同じ 'スコープ'を持ちますか? (つまり、マニフェストで宣言されているのと同じ条件/状況でブロードキャストを受信しますか?)
  4. マニフェストで受信者を指定するときに、Applicationサブクラスと異なる場合は、ローカルブロードキャストではなく、一般的な(非ローカル)ブロードキャストを使用する必要がありますか? (私のIntentServiceが作業を完了すると、実際のアプリでは、ローカル放送が送信されますIntentServiceは、FCMのプッシュメッセージによってトリガーされます。)

NB - 私はthe documentationにこのことについて見つけるように見えることができますすべてであります:

注:ではなく LocalBroadcastManager.registerReceiver(BroadcastReceiver, IntentFilter)を呼び出して、ローカル放送のために登録します。

...マニフェストで受信者を指定できるかどうかの主な問題には対処しません。

+2

マニフェストおよびローカルブロードキャストからのBroadcastReceiverは、2つの異なる目的のために使用されています。あなたのマニフェスト宣言を調べているうちに、アプリケーション外からのアクションも聴こうとしているようです。だから、ここでそれをすることはできません。 –

答えて

3

マニフェストにローカルブロードキャスト受信機を登録することはできますか?

と私はそれがマニフェストで宣言された受信機と同じ「スコープ」を持っていますが、代わりに自分のアプリケーションのサブクラスでそれを宣言? (つまり、マニフェストで宣言されているのと同じ条件/状況のブロードキャストを受信しますか?)

マニフェストに登録された受信者は、任意のプロセスに由来するシステムブロードキャスト用です。 LocalBroadcastManagerは、自分のプロセス内で "ブロードキャスト"のためにローカルです。

Applicationに受信者をLocalBroadcastManagerと登録してください。、そのonCreate())、私はあなたが解決しようとしている問題があれば、より良い解決策があると考えています。実際のアプリで

、ローカル放送は私IntentServiceがその作業

を完了したときに、受信機が完了している仕事について知っている必要がありアクティビティまたはフラグメントに登録する必要があります送信されます。 Applicationは完了したかどうかを知る必要はなく、IntentServiceApplicationのメソッドを呼び出し、このすべてのブロードキャストをバイパスできます。

+0

受信者の 'onReceive()'メソッドで実際に何が起きるかは通知が表示されるだけです。したがって、どのアクティビティにも結びついていません(ユーザーが通知を開くまで、そのアクティビティは後で作成されません)。私の 'Application'は受信機を登録するのに最適な場所です –

+0

@ ban-geoengineering: "受信者のonReceive()メソッドで実際に何が起こるかは、通知を表示するだけです。" - IntentServiceからそれを行い、すべての放送を取り除く。 「私のアプリケーションは受信機を登録するのに最適な場所ですか? - 受信機を完全に削除するのが最も良い方法です。 – CommonsWare

+0

ありがとうございます、はい、意味があります。ローカルブロードキャストは他のコンポーネント(たとえば、アクティブなアクティビティでUIを更新する)でも使用されるため、このアプローチを採用しました。そのため、アプリケーション全体で常に同じローカルブロードキャストを聴く別の方法を探していました。また、 'Application'サブクラスを使用してローカルブロードキャストを受信するという考えのもう一つの部分は、' IntentService'がちょうどそれを行う(つまり、サーバからデータを取得する)ことを許可し、 (つまり、通知を示す 'Application'サブクラス)。それは貧しいデザインだろうか? –

関連する問題