私はこの小さなサンプルプロジェクトを試していますが、それはすべて、アクティビティ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>
何が間違っていますか?
ToastDisplayのソースコードは問題ありませんが(私のものは同様で動作します)、現在フォアグラウンドにある場合(onResumeでレシーバーを登録する場合)にのみ、何かを受け取ります。ただし、別のアクティビティ(この場合はSendBroadcastアクティビティ)が表示されている場合は何も受信できません。
代わりに、おそらく startActivity 最初のアクティビティからToastDisplayを使用しますか?
BroadcastReceiverとActivityは、異なるユースケースで意味があります。 私のアプリケーションで バックグラウンドGPS追跡サービスから通知を受け取り、アクティビティに表示する必要があります(アクティビティがforegroundにある場合)。
マニフェストに受信者を登録する必要はありません。私のユースケースでは偶数harmful-レシーバーはアクティビティのUIを操作し、アクティビティが現在表示されていません。代わりに、 BroadcastReceiver documentation で説明されているように、onResumeおよびonPauseでアクティビティのレシーバーを登録および登録解除します。
このクラスのインスタンスをContext.registerReceiver()で動的に登録するか、AndroidManifest.xmlのタグを介して実装を静的に公開できます。
_ Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT);
_
トーストをしますが、表示しません。
Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();
を実行する必要があります
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);
}
マニフェストでレシーバーをクラスとして定義する必要があり、レシーバーはインテントを受け取ります:
<application
....
<receiver Android:name=".ToastReceiver">
<intent-filter>
<action Android:name="com.unitedcoders.Android.broadcasttest.SHOWTOAST"/>
</intent-filter>
</receiver>
</application>
また、ToastDisplay内でクラスを手動で作成する必要はありません。
指定したコードでは、実際にインテントを受け取るためにToastDisplayアクティビティ内にいる必要があります。
あなたの問題は、他の活動が始まる前に放送を送ることだと思います!そのため、他のアクティビティは何も受け取りません。
トーストメッセージを表示するために使用される.show()を最後に記述することを忘れます。
Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();
プログラマーはよくある間違いですが、この後は二度と同じ間違いを繰り返さないと思います...:D
また、次のようにonCreate()でレシーバーを登録する必要があります。
IntentFilter filter = new IntentFilter();
filter.addAction("csinald.meg");
registerReceiver(receiver, filter);