web-dev-qa-db-ja.com

Androidアクティビティ内のBroadcastReceiver

私はこの小さなサンプルプロジェクトを試していますが、それはすべて、アクティビティ1にブロードキャストを送信するボタンがあります。アクティビティ2は、受信するとトーストを表示します。以下はコードです。ブロードキャストは受信されません。何が間違っていますか?

ブロードキャストの送信

public class SendBroadcast extends Activity {

    public static String BROADCAST_ACTION = "com.unitedcoders.Android.broadcasttest.SHOWTOAST";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void sendBroadcast(View v){
        Intent broadcast = new Intent();
        broadcast.setAction(BROADCAST_ACTION);
        sendBroadcast(broadcast);
    }
}

受信中

public class ToastDisplay extends Activity {

    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT);
        }
    };

    @Override
    protected void onResume() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(SendBroadcast.BROADCAST_ACTION);
        registerReceiver(receiver, filter);
        super.onResume();
    }

    @Override
    protected void onPause() {
        unregisterReceiver(receiver);
        super.onPause();
    }
}

マニフェスト

<application Android:icon="@drawable/icon" Android:label="@string/app_name">
    <activity Android:name=".SendBroadcast" Android:label="@string/app_name">
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity Android:name=".ToastDisplay">
        <intent-filter>
            <action Android:name="com.unitedcoders.Android.broadcasttest.SHOWTOAST"></action>
        </intent-filter>
    </activity>
</application>
46
nheid

何が間違っていますか?

ToastDisplayのソースコードは問題ありませんが(私のものは同様で動作します)、現在フォアグラウンドにある場合(onResumeでレシーバーを登録する場合)にのみ、何かを受け取ります。ただし、別のアクティビティ(この場合はSendBroadcastアクティビティ)が表示されている場合は何も受信できません。

代わりに、おそらく startActivity 最初のアクティビティからToastDisplayを使用しますか?

BroadcastReceiverとActivityは、異なるユースケースで意味があります。 私のアプリケーションで バックグラウンドGPS追跡サービスから通知を受け取り、アクティビティに表示する必要があります(アクティビティがforegroundにある場合)。

マニフェストに受信者を登録する必要はありません。私のユースケースでは偶数harmful-レシーバーはアクティビティのUIを操作し、アクティビティが現在表示されていません。代わりに、 BroadcastReceiver documentation で説明されているように、onResumeおよびonPauseでアクティビティのレシーバーを登録および登録解除します。

このクラスのインスタンスをContext.registerReceiver()で動的に登録するか、AndroidManifest.xmlのタグを介して実装を静的に公開できます。

40
geekQ
_ Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT);
_

トーストをしますが、表示しません。

Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();を実行する必要があります

38
rfsk2010

ToastDisplayクラスをBroadcastReceiverで拡張し、レシーバをマニフェストファイルに登録します。ブロードキャストレシーバをonResume()に登録しないでください。

<application
  ....
  <receiver Android:name=".ToastDisplay">
    <intent-filter>
      <action Android:name="com.unitedcoders.Android.broadcasttest.SHOWTOAST"/>
    </intent-filter>
  </receiver>
</application>

アクティビティに登録する場合は、onCreate()メソッドに登録します。例:

onCreate(){

    sentSmsBroadcastCome = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "SMS SENT!!", Toast.LENGTH_SHORT).show();
        }
    };
    IntentFilter filterSend = new IntentFilter();
    filterSend.addAction("m.sent");
    registerReceiver(sentSmsBroadcastCome, filterSend);
}
5
Tushar Bapte

マニフェストでレシーバーをクラスとして定義する必要があり、レシーバーはインテントを受け取ります:

<application
  ....
  <receiver Android:name=".ToastReceiver">
    <intent-filter>
      <action Android:name="com.unitedcoders.Android.broadcasttest.SHOWTOAST"/>
    </intent-filter>
  </receiver>
</application>

また、ToastDisplay内でクラスを手動で作成する必要はありません。

指定したコードでは、実際にインテントを受け取るためにToastDisplayアクティビティ内にいる必要があります。

4
m_vitaly

あなたの問題は、他の活動が始まる前に放送を送ることだと思います!そのため、他のアクティビティは何も受け取りません。

  1. コードをテストするためのベストプラクティスは、スレッドまたはサービスからブロードキャストを送信して、アクティビティが開かれ、レシーバーが登録され、バックグラウンドプロセスがメッセージを送信することです。
  2. 送信者アクティビティからToastDisplayアクティビティを開始します(テストしませんでしたが、おそらく動作する可能性があります)
1
daigoor

トーストメッセージを表示するために使用される.show()を最後に記述することを忘れます。

Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();

プログラマーはよくある間違いですが、この後は二度と同じ間違いを繰り返さないと思います...:D

1
Anu

また、次のようにonCreate()でレシーバーを登録する必要があります。

IntentFilter filter = new IntentFilter();
filter.addAction("csinald.meg");
registerReceiver(receiver, filter);
0
keybee