Android ローカルブロードキャスト LocalBroadcastManager
重要な注意点:
LocalBroadcastManagerは AndroidX で非推奨となりました。公式の推奨は、アプリ内通信にLiveData/Flowを使用することですが、面接ではまだ出題されます。
1. ローカルブロードキャストとは(グローバルブロードキャストとの比較)
グローバルブロードキャスト(先ほど学んだ sendBroadcast / sendOrderedBroadcast)
- システム AMS を経由し、アプリ間(クロスアプリ)で動作するため、すべてのアプリがこのブロードキャストを受信できる
- セキュリティリスク:データが他のアプリに傍受されやすい。また、他のアプリが偽のブロードキャストを送って自アプリを攻撃する可能性がある
ローカルブロードキャスト LocalBroadcastManager
- ブロードキャストは現在のアプリ内でのみ処理され、システムのグローバルブロードキャスト機構を経由しない。他のアプリは一切受信できない ✅ メリット:
- 安全:ブロードキャストが外部アプリに漏れることがなく、外部アプリが偽装ブロードキャストを送り込むことも不可能
- 高速:プロセス間通信やシステム AMS とのやり取りが不要なため、処理が速い
- パーミッションの宣言が不要 デメリット:
- 動的登録のみ対応。静的登録(AndroidManifest への receiver 宣言)は無効
- 同じアプリ内でのみ有効。プロセスやアプリをまたぐことはできない
- システムブロードキャストと併用できない
2. コード完全解説
2.1 カスタムレシーバー MyReceiver
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context, "ローカルブロードキャストを受信しました", Toast.LENGTH_LONG).show();
}
}
Code language: PHP (php)
2.2 Activity での LocalBroadcastManager の使用
package cn.bamn.www.localcastdmeo;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private LocalBroadcastManager localBroadcastManager; // ローカルブロードキャストマネージャーへの参照
private IntentFilter intentFilter;
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// LocalBroadcastManager のシングルトンインスタンスを取得
localBroadcastManager = LocalBroadcastManager.getInstance(this);
Button button = (Button) findViewById(R.id.btn_send);
button.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
// Intent アクションを構築し、ローカルブロードキャストを送信
Intent intent = new Intent("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);
}
});
// ローカルブロードキャストレシーバーを動的に登録
intentFilter = new IntentFilter();
intentFilter.addAction("com.foxdevelop.www.LocalCastDemo.LOCAL_BROADCAST");
myReceiver = new MyReceiver();
localBroadcastManager.registerReceiver(myReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 必ず登録解除すること!メモリリークを防ぐ
localBroadcastManager.unregisterReceiver(myReceiver);
}
}
Code language: JavaScript (javascript)
主要 API:
LocalBroadcastManager.getInstance(context):インスタンスの取得(シングルトン)registerReceiver(receiver, intentFilter):レシーバーを動的に登録するsendBroadcast(intent):順序なしローカルブロードキャストを送信;sendOrderedBroadcast()は順序付きローカルブロードキャストunregisterReceiver():画面破棄時に登録解除する — 必ず書くこと、メモリリークの落とし穴
3. ローカルブロードキャスト、順序なしグローバルブロードキャスト、順序付きグローバルブロードキャストの比較まとめ
| 種類 | 通信範囲 | アプリ間通信 | 中断可能 | 登録方法 | 基盤メカニズム |
|---|---|---|---|---|---|
| グローバル順序なしブロードキャスト sendBroadcast | グローバル | 可 | abort不可 | 静的+動的 | システム AMS プロセス間通信 |
| グローバル順序付きブロードキャスト sendOrderedBroadcast | グローバル | 可 | abortBroadcastで中断 | 静的+動的 | システム AMS プロセス間通信、priority順に直列処理 |
| ローカルブロードキャスト LocalBroadcastManager | アプリ内 | 不可 | 順序付きブロードキャストの中断に対応 | 動的のみ | メモリ内配送、AMS不使用、高効率 |
Android ローカルブロードキャスト
Previous: 順次ブロードキャスト