これは Android の四大コンポーネントの一つであるブロードキャストレシーバー(BroadcastReceiver)を使ったアプリ間通信のサンプルです。2 つの独立したプロジェクトでApp1 がカスタムブロードキャストを送信し、App2 がそれを受信する仕組みを紹介します。
1. コアコンセプト
Android のブロードキャストはシステムレベルのメッセージ配信/購読メカニズムです:
- ブロードキャストはアプリケーション間で送受信できます。また、カスタムブロードキャストだけでなく、システムブロードキャスト(起動完了、バッテリー変化、画面ロックなど)も受信可能です。
- テスト方法:2 つの独立した Android プロジェクトを新規作成
- SendDemo:カスタムブロードキャストを送信するアプリ(送信側)
- SendDemo2:ブロードキャストを受信するアプリ(受信側。スクリーンショット内のプロジェクト)
2. 受信側のコード(SendDemo2)
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadCastService extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// ブロードキャスト受信時にコールバックされ、Toast を表示
Toast.makeText(context, "カスタムブロードキャスト22222を受信しました", Toast.LENGTH_LONG).show();
}
}
Code language: JavaScript (javascript)
BroadcastReceiverを継承し、onReceive()をオーバーライドする必要があります。ブロードキャストを受信するとこのメソッドが自動的に実行されます。- 注意:
onReceiveでは時間のかかる処理は行わないでください。ブロードキャストのライフサイクルは非常に短いためです。
3. ブロードキャストレシーバーの登録(2 つの方法)
方法 1:静的登録(AndroidManifest.xml に登録。アプリが起動していなくても受信可能。ただし Android 8.0 以降は制限あり)
<receiver android:name=".MyBroadCastService">
<intent-filter>
<!-- アクション識別子。送信側は全く同じ action 文字列を使用する必要があります -->
<action android:name="com.foxdevelop.MY_CUSTOM_BROADCAST"/>
</intent-filter>
</receiver>
Code language: HTML, XML (xml)
送信側 SendDemo がブロードキャストを送信する際、Intent の action には必ず
com.foxdevelop.MY_CUSTOM_BROADCASTを指定する必要があります。両方の action が一致して初めて受信できます。
方法 2:動的登録(コード内で登録。アプリが実行中の場合のみ受信可能)
MyBroadCastService receiver = new MyBroadCastService();
IntentFilter filter = new IntentFilter("com.foxdevelop.MY_CUSTOM_BROADCAST");
registerReceiver(receiver, filter);
Code language: JavaScript (javascript)
4. 送信側 SendDemo のブロードキャスト送信コード
// カスタムのアプリ間ブロードキャストを送信
Intent intent = new Intent("com.foxdevelop.MY_CUSTOM_BROADCAST");
sendBroadcast(intent);
Code language: JavaScript (javascript)
5. 注意点
- Android 8.0 (API 26) 以降:静的登録されたカスタムの暗黙的ブロードキャストは制限されます。多くのカスタム action は静的登録では受信できなくなります。
- 解決策:① 動的登録を使用する;② ブロードキャスト送信時にパッケージ名を指定し、明示的 Intent を使用する。
- システムブロードキャスト(ネットワーク変更、バッテリーなど)のほとんどは引き続き正常に受信できますが、一部のシステムブロードキャストにも制限があります。
- アプリ間ブロードキャストにはセキュリティリスクがあるため、権限を設定して送受信を制御することができます。
6. 実行フロー
- SendDemo(送信側)と SendDemo2(受信側)の 2 つのアプリを同じ端末/エミュレーターにインストールします。
- SendDemo でボタンをタップし、
sendBroadcastを呼び出して action がcom.foxdevelop.MY_CUSTOM_BROADCASTのブロードキャストを送信します。 - システムがブロードキャストを配信し、その action に登録されているすべての BroadcastReceiver(SendDemo2 内の MyBroadCastService)の
onReceiveがトリガーされます。 - SendDemo2 に Toast が表示されます:
カスタムブロードキャスト22222を受信しました
Android でのアプリ間ブロードキャスト受信
Previous: カスタムブロードキャストを送信
Next: 順次ブロードキャスト