Android
BroadcastReceiver
サーチ…
前書き
BroadcastReceiver(レシーバ)は、システムイベントやアプリケーションイベントに登録できるAndroidコンポーネントです。このイベントが発生すると、Androidランタイムは、登録されたすべてのイベントの受信者に通知します。
例えば、画面が消灯したこと、電池が残っていること、または画像が取り込まれたことを知らせる放送である。
アプリケーションは、ブロードキャストを開始することもできます。たとえば、一部のデータがデバイスにダウンロードされ、使用できるようになっていることを他のアプリケーションに知らせることができます。
放送受信機の概要
ブロードキャスト受信機は、システムまたはアプリケーションのイベントに登録できるAndroidコンポーネントです。
レシーバは、 AndroidManifest.xml
ファイルを介して登録することも、 Context.registerReceiver()
メソッドを介して動的に登録することもできます。
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//Your implementation goes here.
}
}
ここでは、Androidがブートプロセスを完了すると、システムによって起動されるACTION_BOOT_COMPLETED
例を取り上げました。
次のようにマニフェストファイルにレシーバを登録することができます:
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
</intent-filter>
</receiver>
</application>
デバイスが起動されると、 onReceive()
メソッドが呼び出され、次に作業を行うことができます(例えば、サービスの開始、アラームの開始など)。
BroadcastReceiverの基本
BroadcastReceiversは、Android OS、他のアプリ、または同じアプリ内で送信されたブロードキャストインテントを受信するために使用されます。
各インテントはインテントフィルターで作成されますが 、これにはストリングアクションが必要です。インテントに追加情報を設定することができます。
同様に、BroadcastReceiversは、特定のインテントフィルターでインテントを受信するように登録します。プログラムで登録することができます:
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//Your implementation goes here.
}
}, new IntentFilter("Some Action"));
またはAndroidManifest.xml
ファイルに保存します。
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="Some Action"/>
</intent-filter>
</receiver>
インテントを受け取るには、アクションをAndroid OS、別のアプリまたはAPI、または自分のアプリケーション内でsendBroadcast
を使用して文書化したものに設定します。
mContext.sendBroadcast(new Intent("Some Action"));
さらに、インテントは、で見ることができる文字列、プリミティブ、及びParcelables、などの情報を含むことができるonReceive
。
LocalBroadcastManagerの使用
LocalBroadcastManagerは、ブロードキャスト送信するために使用されるインテントを望まないリスナーにそれらをさらすことなく、アプリケーション内で。
LocalBroadcastManagerを使用すると、 context.sendBroadcast()
直接使用するより効率的で安全です。これは、他のアプリケーションによって偽装されたブロードキャストを心配する必要がないため、セキュリティ上の危険が生じる可能性があります。
ローカルブロードキャストの送受信の簡単な例を次に示します。
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("Some Action")) {
//Do something
}
}
});
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(mContext);
manager.registerReceiver(receiver, new IntentFilter("Some Action"));
// onReceive() will be called as a result of this call:
manager.sendBroadcast(new Intent("Some Action"));//See also sendBroadcastSync
//Remember to unregister the receiver when you are done with it:
manager.unregisterReceiver(receiver);
Bluetoothブロードキャスト受信機
マニフェストファイルに権限を追加する
<uses-permission android:name="android.permission.BLUETOOTH" />
あなたのフラグメント(またはアクティビティ)
- 受信者メソッドを追加する
private BroadcastReceiver mBluetoothStatusChangedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final Bundle extras = intent.getExtras();
final int bluetoothState = extras.getInt(Constants.BUNDLE_BLUETOOTH_STATE);
switch(bluetoothState) {
case BluetoothAdapter.STATE_OFF:
// Bluetooth OFF
break;
case BluetoothAdapter.STATE_TURNING_OFF:
// Turning OFF
break;
case BluetoothAdapter.STATE_ON:
// Bluetooth ON
break;
case BluetoothAdapter.STATE_TURNING_ON:
// Turning ON
break;
}
};
ブロードキャストを登録する
- onResume()でこのメソッドを呼び出す
private void registerBroadcastManager(){
final LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
manager.registerReceiver(mBluetoothStatusChangedReceiver, new IntentFilter(Constants.BROADCAST_BLUETOOTH_STATE));
}
ブロードキャストの登録を解除する
- onPause()でこのメソッドを呼び出します。
private void unregisterBroadcastManager(){
final LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
// Beacon機能用
manager.unregisterReceiver(mBluetoothStatusChangedReceiver);
}
ブロードキャスト受信者のプログラムによる有効化と無効化
BroadcastReceiver
を有効または無効にするには、 PackageManager
への参照を取得する必要がありComponentName
有効/無効にする受信者のクラスを含むComponentName
オブジェクトが必要です。
ComponentName componentName = new ComponentName(context, MyBroadcastReceiver.class);
PackageManager packageManager = context.getPackageManager();
ここで、 BroadcastReceiver
を有効にするために、次のメソッドを呼び出すことができます:
packageManager.setComponentEnabledSetting(
componentName,
PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
PackageManager.DONT_KILL_APP);
代わりに、 COMPONENT_ENABLED_STATE_DISABLED
を使用して受信者を無効にすることもできます。
packageManager.setComponentEnabledSetting(
componentName,
PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
PackageManager.DONT_KILL_APP);
BOOT_COMPLETEDイベントを処理するBroadcastReceiver
以下の例は、 BOOT_COMPLETED
イベントを受け取ることができるBroadcastReceiver
を作成する方法を示しています。このようにして、すぐにデバイスを起動したときにService
を開始したり、 Activity
を開始することができます。
また、 BOOT_COMPLETED
イベントを使用すると、デバイスの電源がオフのときにアラームが破棄されるため、アラームを復元できます。
注: BOOT_COMPLETED
アクションを受け取るには、少なくとも1回はアプリケーションを起動する必要があります。
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.example" >
...
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
...
<application>
...
<receiver android:name="com.test.example.MyCustomBroadcastReceiver">
<intent-filter>
<!-- REGISTER TO RECEIVE BOOT_COMPLETED EVENTS -->
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
</application>
</manifest>
MyCustomBroadcastReceiver.java
public class MyCustomBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action != null) {
if (action.equals(Intent.ACTION_BOOT_COMPLETED) ) {
// TO-DO: Code to handle BOOT COMPLETED EVENT
// TO-DO: I can start an service.. display a notification... start an activity
}
}
}
}
LocalBroadcastManagerの例
BroadcastReceiverは、基本的に、特定のアクションを実行するためにOSを介してインテントをリレーするメカニズムです。古典的な定義
「放送受信機は、システムイベントやアプリケーションイベントに登録できるAndroidコンポーネントです。
LocalBroadcastManagerは、アプリケーションプロセス内でブロードキャストを送受信する方法です。このメカニズムには多くの利点があります
- データはアプリケーションプロセス内に残るため、データが漏洩することはありません。
- 通常の放送の解像度は、OS全体で実行時に発生するため、LocalBroadcastはより早く解決されます。
LocalBroastManagerの簡単な例は次のとおりです。
SenderActivity
Intent intent = new Intent("anEvent");
intent.putExtra("key", "This is an event");
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
ReceiverActivity
- 受信機を登録する
LocalBroadcastManager.getInstance(this).registerReceiver(aLBReceiver, new IntentFilter("anEvent"));
- 受信者が呼び出されたときにアクションを実行する具体的なオブジェクト
private BroadcastReceiver aLBReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // perform action here. } };
- ビューがもう表示されなくなったときに登録を解除します。
@Override protected void onPause() { // Unregister since the activity is about to be closed. LocalBroadcastManager.getInstance(this).unregisterReceiver(aLBReceiver); super.onDestroy(); }
カスタムブロードキャスト受信機を介して2つのアクティビティを通信する
アクティビティーAがアクティビティーBで起こっているイベントを通知できるように、2つのアクティビティーを通信できます。
アクティビティA
final String eventName = "your.package.goes.here.EVENT";
@Override
protected void onCreate(Bundle savedInstanceState) {
registerEventReceiver();
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
unregisterEventReceiver(eventReceiver);
super.onDestroy();
}
private void registerEventReceiver() {
IntentFilter eventFilter = new IntentFilter();
eventFilter.addAction(eventName);
registerReceiver(eventReceiver, eventFilter);
}
private BroadcastReceiver eventReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//This code will be executed when the broadcast in activity B is launched
}
};
活動B
final String eventName = "your.package.goes.here.EVENT";
private void launchEvent() {
Intent eventIntent = new Intent(eventName);
this.sendBroadcast(eventIntent);
}
もちろん、アクティビティ間で渡されるインテントにエクストラを追加するブロードキャストに情報を追加することもできます。例をできるだけシンプルに保つために追加されていません。
スティッキーブロードキャスト
sendStickyBroadcastメソッド(インテント)を使用している場合、対応するインテントはスティッキーです。つまり、ブロードキャストが完了した後に送信するインテントが残ります。名前が示すようにStickyBroadcastは、ブロードキャストが完了した後、ブロードキャストからデータを読み取るメカニズムです。これは、 Activity's onCreate()
起動前に、 Activity's onCreate()
インテント内のキーの値を確認したい場合に使用できます。
Intent intent = new Intent("com.org.action");
intent.putExtra("anIntegerKey", 0);
sendStickyBroadcast(intent);
順序付きブロードキャストの使用
順序付きブロードキャストは、ブロードキャストリスナーの優先度を指定する必要がある場合に使用されます。
この例では、 firstReceiver
は常にsecondReceiver
より前にfirstReceiver
を受信します。
final int highPriority = 2;
final int lowPriority = 1;
final String action = "action";
// intent filter for first receiver with high priority
final IntentFilter firstFilter = new IntentFilter(action);
first Filter.setPriority(highPriority);
final BroadcastReceiver firstReceiver = new MyReceiver();
// intent filter for second receiver with low priority
final IntentFilter secondFilter = new IntentFilter(action);
secondFilter.setPriority(lowPriority);
final BroadcastReceiver secondReceiver = new MyReceiver();
// register our receivers
context.registerReceiver(firstReceiver, firstFilter);
context.registerReceiver(secondReceiver, secondFilter);
// send ordered broadcast
context.sendOrderedBroadcast(new Intent(action), null);
さらに、放送受信機は、順序付き放送を中止することができる。
@Override
public void onReceive(final Context context, final Intent intent) {
abortBroadcast();
}
この場合、優先度の低いすべての受信者はブロードキャストメッセージを受信しません。
Android停止状態
Android 3.1以降、すべてのアプリケーションはインストール時に停止状態になります。停止状態では、アプリケーションは何らかの理由で実行されません。ただし、アクティビティの手動起動またはアクティビティ、サービス、またはブロードキャストに対処する明示的なインテント以外は実行されません。
APKを直接インストールするシステムアプリを作成するときは、新しくインストールされたAPPが停止していない状態に移行するまでブロードキャストを受信しないことを考慮してください。
アプリを有効にする簡単な方法は、このアプリに明示的なブロードキャストを送信することです。ほとんどのアプリはINSTALL_REFERRER
を実装しているので、これをフックポイントとして使用できます
インストールされているアプリのマニフェストをスキャンし、明示的なブロードキャストを各受信者に送信します:
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.setComponent(new ComponentName(packageName, fullClassName));
sendBroadcast(intent);