AndroidのBroadcastReceiver - Ordered Broadcast
Ordered Broadcastは
- 指定した順位で受信する(setPriority() Or android:priotiry)
- 次の受信者にデータ送信できる
- Broadcast Intent終了できる(abortBroadcast())
サンプルコード
① MainActivity.javaのボタンでOrdered Broadcastを行う
package com.example.liguofeng.myorderedbroadcast; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // ボタンクリック ((Button) findViewById(R.id.broadcast)).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setAction("com.example.liguofeng.action.ORDERED_BROADCAST"); intent.putExtra("msg1", "data from MainActivity."); // Ordered Broadcast sendOrderedBroadcast(intent, null); } }); } }
② MyFirstReceiverが受信し、Broadcastを終了する
package com.example.liguofeng.myorderedbroadcast; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class MyFirstReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "IntentAction : " + intent.getAction() + "\n" + "Message : " + intent.getStringExtra("msg1"), Toast.LENGTH_LONG) .show(); Bundle data = new Bundle(); data.putString("msg2", "data from MyfristReceiver."); // 処理結果 setResultExtras(data); } }
② MySecondReceiverが受信し、処理結果データを設定する
package com.example.liguofeng.myorderedbroadcast; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.widget.Toast; public class MySecondReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 前の処理結果 Bundle data = getResultExtras(true); String first = data.getString("msg2"); Toast.makeText(context, "Message1 : " + intent.getStringExtra("msg1") + "\n" + "Message2 : " + data.getString("msg2"), Toast.LENGTH_LONG) .show(); // broadcast終了 abortBroadcast(); } }
③ MyThirdReceiverは受信できない
package com.example.liguofeng.myorderedbroadcast; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyThirdReceiver extends BroadcastReceiver { public MyThirdReceiver() { } @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "これは表示されないね", Toast.LENGTH_LONG) .show(); } }
④ AndroiManifest.xmlに追加
<receiver android:name=".MyFirstReceiver" android:enabled="true" android:exported="true"> <intent-filter android:priority="100"> <action android:name="com.example.liguofeng.action.ORDERED_BROADCAST" /> </intent-filter> </receiver> <receiver android:name=".MySecondReceiver" android:enabled="true" android:exported="true" > <intent-filter android:priority="50"> <action android:name="com.example.liguofeng.action.ORDERED_BROADCAST" /> </intent-filter> </receiver> <receiver android:name=".MyThirdReceiver" android:enabled="true" android:exported="true" > <intent-filter android:priority="10"> <action android:name="com.example.liguofeng.action.ORDERED_BROADCAST" /> </intent-filter> </receiver>