読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

AndroidのBroadcastの配信順を考える

Android

概要

下記二つのBroadcastの違いを理解し、配信順を考える

Normal Broadcast 受信可能なBroadcast Receiverに対して一斉に配信
Ordered Broadcast 受信可能なBroadcast Receiverに対して順番に配信

詳細

Broadcastには一斉に配信されるNormal broadcastとOrdered Broadcastがある

Normal Broadcast

受信可能なBroadcast Receiverに対して一斉に配信される
配信は非同期で、受信する順番は特に決められていない
ex)
android.intent.action.SCREEN_ON
android.intent.action.TIME_TICK

Ordered Broadcast

受信可能なBroadcast Receiverに順番に配信される
同時に受信できるBroadcast Recieverは1つで、onReceive()の処理が終わると次のReceiverが次のBroadcastを受信する
順番はpriorityが高いReceiverから順番に受信
ex)
android.provider.Telephony.SMC_RECEIVED
android.intent.action.NEW_OUTGOING_CALL

Normal BroadcastとOrdered Broadcastの役割の違い

Normal Broadcastの役割は単純で多数のアプリに「イベントを通知」すること
例えば、電池が少なくなったときや、時刻が変化したときなどを通知することが目的
配信後は用済みなのでIntentは消滅するが、Sticky Broadcasatは消滅しない

Ordered Broadcastの役割は「情報の伝達」
Ordered BroadcastはBroadcastを発信する側が情報の処理を様々なアプリにゆだねることが出来る
そして、Broadcastの発信者はBroadcast Intentを最後に自信で受け取れるので、ほかのアプリが処理した情報を利用できる
イベントを中断することもできる
つまり、Ordered Broadcastに含まれる情報は、さまざまなアプリによって手が加えられている可能性を考慮する必要がある

Ordered Broadcastの実用例

ユーザーが通話しようとするときに発信されるNEW_OUTGOING_CALL intentは、Ordered Broadcastであり、リファレンスにはIntentの情報について記載がある

Broadcastが終了したとき、ressultDataを実際に電話する番号に使用する、nullの場合は電話をしない
様々な電話番号を整形するアプリ(国際電話用アプリなど)を想定して、NEW_OUTGOING_CALLではOrdered Broadcastが採用されている
最終的に使用される電話番号はgetResultDataで、元の電話番号はEXTRA_PHONE_NUMBER

特定の電話番号は通話をキャンセルする処理の例

@Override
public void onReceive(Context context, Intent intent) {
	// getResultData()には直前のReceiverの結果が格納されている
	String phoneNumber = getResultData();

	// 直前のReceiverが何も設定していない場合には、オリジナルの値を使う
	if(phoneNumber == null) {
		phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
	}

	// 通話が許可されているか
	if(invalidNumber(phoneNumber)) {
		// nullをセットして通話をキャンセル
		setResultData(null);
	}
}

Ordered Broadcastは情報の改変がどこかで行われていることを考慮して実装する必要がある
また、BroadcastReceiver#isOrderedBroadcastで現在OrderedBroadcstを処理しているかを判定できる

参考

Stickyブロードキャストの配信 - スマートフォンまとめ
Intent | Android Developers
Intent | Android Developers

良いAndroidアプリを作る139の鉄則

良いAndroidアプリを作る139の鉄則