Android学習ノート40:Android 4大コンポーネントのBroadcastReceiver
12643 ワード
Androidアプリケーションの4つのコンポーネントは、Activity、Service、BroadcastReceiver、ContentProviderです.このうち、Activity、Service、ContentProviderは、以前のブログで紹介したもので、具体的には以下の通りです.
(1)Activity:《 Android学習ノート38:Androidの4大コンポーネントのActivity 》
(2)Service:《 Android学習ノート39:Android 4大コンポーネントのサービス 》
(3)ContentProvider:《 Android学習ノート37:Content Providers方式でデータ共有 》
ここでは主にBroadcastReceiverについて説明します.
1.システム放送
BroadcastReceiverは、ブロードキャストメッセージを受信し、メッセージに応答するコンポーネントであり、サービスと同様にユーザーとインタラクティブなUIインタフェースを提供しません.
Androidシステムには多くの標準的なブロードキャスト動作があり、その中でよく見られるのは以下の通りです.
(1)Intent.ACTION_CAMERA_BUTTON;//撮影ボタンを押す
(2)Intent.ACTION_DATA_CHANGED;//設備日付変更
(3)Intent.ACTION_TIME_CHANGED;//設定時間が変わる
(4)Intent.ACTION_TIMEZONE_CHANGED;//タイムゾーンが変わる
(5)Intent.ACTION_BOOT_COMPLETED;//システム起動完了
(6)Intent.ACTION_PACKAGE_ADDED;//APKの正常なインストール
(7)Intent.ACTION_PACKAGE_CHANGED;//インストールしたAPKが変更されました
(8)Intent.ACTION_PACKAGE_REMOVED;//APKの削除
(9)Intent.ACTION_PACKAGE_DATA_CLEARED;//アプリケーションのデータ消去
(10)Intent.ACTION_BATIERY_LOW;//バッテリーが低い
(11)Intent.ACTION_BATIERY_CHANGED;//充電状態でバッテリーの電力量が変化
(12)Intent.ACTION_POWER_CONNECTED;//外部電源接続
(13)Intent.ACTION_POWER_DISCONNECTED;//外部電源を切る
(14)Intent.ACTION_HEADSET_PLUG;//イヤホン挿入
(15)Intent.ACTION_INPUT_METHOD_CHANGED;//入力方式の変更
(16)Intent.ACTION_MEDIA_CHECKING;//外部格納装置を挿入して検出する
(17)Intent.ACTION_MEDIA_MOUNTED;//外部記憶装置マウント成功
(18)Intent.ACTION_MEDIA_REMOVED;//外部記憶装置の取り外し
(19)Intent.ACTION_SCREEN_OFF;//画面を閉じる
(20)Intent.ACTION_SCREEN_ON;//画面が開く
(21)Intent.ACTION_SHUTDOWN;//システムのシャットダウン
これらはAndroidシステムに内蔵されているいくつかのブロードキャスト動作であり、私たちのアプリケーションでこれらのブロードキャスト動作を直接受信し、受信した異なるブロードキャストに応じて対応する処理を行うことができます.
2.放送の配信
以上紹介したAndroidシステムに内蔵されたブロードキャストのほか、独自のアプリケーションでカスタムブロードキャストを作成して発表したい場合も簡単です.
ブロードキャストのコンテンツとフィルタリングブロードキャストの動作はIntentオブジェクトに伝送されるので,Intentクラスが提供するputExtra()メソッドによりIntentオブジェクトにブロードキャストコンテンツを加え,Intentクラスが提供するsetAction()メソッドによりIntent対象にフィルタリングブロードキャストの動作を加えることができる.具体的な実装方法は、次のコードで示されています.
以上のコードでは,setAction()法によりIntentオブジェクトにフィルタリングブロードキャストの動作を加えた.この動作は我々がカスタマイズしたものであり,Androidに内蔵されたブロードキャスト動作のように,我々がカスタマイズしたブロードキャストを一意に識別するために使用できる.ここでは、このアクションを次のように定義します.
さらに,putExtra()法によりIntentオブジェクトにブロードキャストされたコンテンツを加え,ブロードキャストされたコンテンツはEditTextコントロールの入力コンテンツである.putExtra()メソッドは、キー値ペアとしてデータを格納する方法を提供する.
最後に,sendBroadcast()メソッドにより,放送情報を携帯したIntentオブジェクトを送信すればよい.
注意すべき点は、Contextクラスでは、以下の3つの方法でブロードキャストが送信されることです.
(1)Context.sendBroadcast();
(2)Context.sendStickyBroadcast();
(3)Context.sendOrderedBroadcast();
このうちsendBroadcast()方式で送信されたIntentでは,条件を満たすBroadcastReceiverはすべてそのonReceive()メソッドを実行するが,条件を満たすBroadcastReceiverが複数ある場合,そのonReceive()メソッドを実行する順序は一定ではない.
sendStickyBroadcast()方式で送信されるIntentは常に存在し、registerReceive()メソッドを呼び出して条件を満たすBroadcastReceiverを登録すると、Intentオブジェクトは新しく登録されたBroadcastReceiverに直接戻ります.
sendOrderedBroadcast()方式で送信されたIntentは、BroadcastReceiver登録時にIntentFilterが設定した優先度の順序に従ってonReceive()メソッドを実行するが、同じ優先度のBroadcastReceiverがonReceive()メソッドを実行する順序は一定ではない.
3.放送受信
アプリケーションでブロードキャスト(Android内蔵ブロードキャストまたはカスタムブロードキャスト)を受信し、受信したブロードキャストを処理する必要がある場合は、ブロードキャストクラス(android.content.BroadcastReceiverクラスから継承)を作成し、ブロードキャストクラスのonReceive()メソッドを実装する必要があります.BroadcastReceiverクラスのonReceive()メソッドは、自分に送信されたブロードキャストを受信すると呼び出されます.
このほか、作成したBroadcastReceiverクラスを登録する必要があります.登録方法は2つあります.1つはAndroidManifestです.xmlファイルにBroadcastReceiverを登録し、もう1つはコードに直接registerReceive()メソッドでBroadcastReceiverを登録します.
この2つの方法がどのように実現されているかをそれぞれ説明します.
3.1 AndroidManifest.xmlファイルにBroadcastReceiverを登録する
まず、BroadcastReceiverクラスを作成し、次のコードに示すように、さっき発表されたブロードキャスト情報を受信して処理する必要があります.
以上のコードにより,「MyBroadcastReceiver」というBroadcastReceiverクラスを作成し,onReceive()メソッドでブロードキャストされたコンテンツを取り出して表示した.
MyBroadcastReceiverのコード作成が完了したらAndroidManifest.xmlファイルにコンポーネントを登録します.具体的な方法は以下の通りです.
タグは<アプリケーション>タグにネストされており、android:name=「.MyBroadcastReceiver」は登録するBroadcastReceiverコンポーネントの名前を指定しています. ラベルのラベルは、BroadcastReceiverコンポーネントのフィルタルールを指定するために使用されます.このラベルのandroid:name=「com.example.android_broadcast.msg」は、私たちが以前定義したブロードキャスト動作であることがわかります.これにより、MyBroadcastReceiverが応答するブロードキャスト動作が唯一決定される.
3.2 registerReceive()メソッドによるBroadcastReceiverの登録
Activityでは、直接onStart()メソッドでregisterReceiver()メソッドを呼び出してBroadcastReceiverを登録し、onStop()メソッドではunregisterReceiver()メソッドを呼び出してBroadcastReceiverの登録を解除することもできます.以下のコードで示します.
なお、ActivityのonResume()メソッドにBroadcastReceiverを登録している場合は、ActivityのonPause()メソッドでBroadcastReceiverの登録を解除する必要があります.
3.3登録放送の二つの方式の違い
AndroidManifestでxmlファイルに登録されているBroadcastReceiverは、常駐型ブロードキャストに属し、アプリケーションがオフになってもブロードキャスト情報があれば作成されたBroadcastReceiverも受信できます.これは静的登録ブロードキャストの形式です
registerReceive()メソッドで登録されているBroadcastReceiverは、非常駐在型ブロードキャストに属し、通常Activityの終了時にunregisterReceiver()メソッドを呼び出してBroadcastReceiverを解除する.これは動的登録ブロードキャストの形式です
(1)Activity:《 Android学習ノート38:Androidの4大コンポーネントのActivity 》
(2)Service:《 Android学習ノート39:Android 4大コンポーネントのサービス 》
(3)ContentProvider:《 Android学習ノート37:Content Providers方式でデータ共有 》
ここでは主にBroadcastReceiverについて説明します.
1.システム放送
BroadcastReceiverは、ブロードキャストメッセージを受信し、メッセージに応答するコンポーネントであり、サービスと同様にユーザーとインタラクティブなUIインタフェースを提供しません.
Androidシステムには多くの標準的なブロードキャスト動作があり、その中でよく見られるのは以下の通りです.
(1)Intent.ACTION_CAMERA_BUTTON;//撮影ボタンを押す
(2)Intent.ACTION_DATA_CHANGED;//設備日付変更
(3)Intent.ACTION_TIME_CHANGED;//設定時間が変わる
(4)Intent.ACTION_TIMEZONE_CHANGED;//タイムゾーンが変わる
(5)Intent.ACTION_BOOT_COMPLETED;//システム起動完了
(6)Intent.ACTION_PACKAGE_ADDED;//APKの正常なインストール
(7)Intent.ACTION_PACKAGE_CHANGED;//インストールしたAPKが変更されました
(8)Intent.ACTION_PACKAGE_REMOVED;//APKの削除
(9)Intent.ACTION_PACKAGE_DATA_CLEARED;//アプリケーションのデータ消去
(10)Intent.ACTION_BATIERY_LOW;//バッテリーが低い
(11)Intent.ACTION_BATIERY_CHANGED;//充電状態でバッテリーの電力量が変化
(12)Intent.ACTION_POWER_CONNECTED;//外部電源接続
(13)Intent.ACTION_POWER_DISCONNECTED;//外部電源を切る
(14)Intent.ACTION_HEADSET_PLUG;//イヤホン挿入
(15)Intent.ACTION_INPUT_METHOD_CHANGED;//入力方式の変更
(16)Intent.ACTION_MEDIA_CHECKING;//外部格納装置を挿入して検出する
(17)Intent.ACTION_MEDIA_MOUNTED;//外部記憶装置マウント成功
(18)Intent.ACTION_MEDIA_REMOVED;//外部記憶装置の取り外し
(19)Intent.ACTION_SCREEN_OFF;//画面を閉じる
(20)Intent.ACTION_SCREEN_ON;//画面が開く
(21)Intent.ACTION_SHUTDOWN;//システムのシャットダウン
これらはAndroidシステムに内蔵されているいくつかのブロードキャスト動作であり、私たちのアプリケーションでこれらのブロードキャスト動作を直接受信し、受信した異なるブロードキャストに応じて対応する処理を行うことができます.
2.放送の配信
以上紹介したAndroidシステムに内蔵されたブロードキャストのほか、独自のアプリケーションでカスタムブロードキャストを作成して発表したい場合も簡単です.
ブロードキャストのコンテンツとフィルタリングブロードキャストの動作はIntentオブジェクトに伝送されるので,Intentクラスが提供するputExtra()メソッドによりIntentオブジェクトにブロードキャストコンテンツを加え,Intentクラスが提供するsetAction()メソッドによりIntent対象にフィルタリングブロードキャストの動作を加えることができる.具体的な実装方法は、次のコードで示されています.
1 /*
2 * Function :
3 * Author : -
4 */
5 public void onClick(View view) {
6 switch(view.getId()) {
7 case R.id.button:
8 Intent intent = new Intent(); // Intent
9 intent.setAction(MY_ACTION); // Intent Action
10 intent.putExtra("key_msg", mEditText.getText().toString()); // Intent
11 sendBroadcast(intent); //
12 break;
13 }
14 }
以上のコードでは,setAction()法によりIntentオブジェクトにフィルタリングブロードキャストの動作を加えた.この動作は我々がカスタマイズしたものであり,Androidに内蔵されたブロードキャスト動作のように,我々がカスタマイズしたブロードキャストを一意に識別するために使用できる.ここでは、このアクションを次のように定義します.
private static final String MY_ACTION = "com.example.android_broadcast.msg";
さらに,putExtra()法によりIntentオブジェクトにブロードキャストされたコンテンツを加え,ブロードキャストされたコンテンツはEditTextコントロールの入力コンテンツである.putExtra()メソッドは、キー値ペアとしてデータを格納する方法を提供する.
最後に,sendBroadcast()メソッドにより,放送情報を携帯したIntentオブジェクトを送信すればよい.
注意すべき点は、Contextクラスでは、以下の3つの方法でブロードキャストが送信されることです.
(1)Context.sendBroadcast();
(2)Context.sendStickyBroadcast();
(3)Context.sendOrderedBroadcast();
このうちsendBroadcast()方式で送信されたIntentでは,条件を満たすBroadcastReceiverはすべてそのonReceive()メソッドを実行するが,条件を満たすBroadcastReceiverが複数ある場合,そのonReceive()メソッドを実行する順序は一定ではない.
sendStickyBroadcast()方式で送信されるIntentは常に存在し、registerReceive()メソッドを呼び出して条件を満たすBroadcastReceiverを登録すると、Intentオブジェクトは新しく登録されたBroadcastReceiverに直接戻ります.
sendOrderedBroadcast()方式で送信されたIntentは、BroadcastReceiver登録時にIntentFilterが設定した優先度の順序に従ってonReceive()メソッドを実行するが、同じ優先度のBroadcastReceiverがonReceive()メソッドを実行する順序は一定ではない.
3.放送受信
アプリケーションでブロードキャスト(Android内蔵ブロードキャストまたはカスタムブロードキャスト)を受信し、受信したブロードキャストを処理する必要がある場合は、ブロードキャストクラス(android.content.BroadcastReceiverクラスから継承)を作成し、ブロードキャストクラスのonReceive()メソッドを実装する必要があります.BroadcastReceiverクラスのonReceive()メソッドは、自分に送信されたブロードキャストを受信すると呼び出されます.
このほか、作成したBroadcastReceiverクラスを登録する必要があります.登録方法は2つあります.1つはAndroidManifestです.xmlファイルにBroadcastReceiverを登録し、もう1つはコードに直接registerReceive()メソッドでBroadcastReceiverを登録します.
この2つの方法がどのように実現されているかをそれぞれ説明します.
3.1 AndroidManifest.xmlファイルにBroadcastReceiverを登録する
まず、BroadcastReceiverクラスを作成し、次のコードに示すように、さっき発表されたブロードキャスト情報を受信して処理する必要があります.
1 /*
2 * Class : BroadcastReceiver ,
3 * Author : -
4 */
5 public class MyBroadcastReceiver extends BroadcastReceiver {
6
7 @Override
8 public void onReceive(Context context, Intent intent) {
9 String msg = intent.getStringExtra("key_msg"); //
10 Toast.makeText(context, " :" + msg, Toast.LENGTH_LONG).show();
11 }
12
13 }
以上のコードにより,「MyBroadcastReceiver」というBroadcastReceiverクラスを作成し,onReceive()メソッドでブロードキャストされたコンテンツを取り出して表示した.
MyBroadcastReceiverのコード作成が完了したらAndroidManifest.xmlファイルにコンポーネントを登録します.具体的な方法は以下の通りです.
1 <receiver
2 android:name=".MyBroadcastReceiver">
3 <intent-filter>
4 <action android:name="com.example.android_broadcast.msg" />
5 </intent-filter>
6 </receiver>
3.2 registerReceive()メソッドによるBroadcastReceiverの登録
Activityでは、直接onStart()メソッドでregisterReceiver()メソッドを呼び出してBroadcastReceiverを登録し、onStop()メソッドではunregisterReceiver()メソッドを呼び出してBroadcastReceiverの登録を解除することもできます.以下のコードで示します.
1 /*
2 * Function : onStart()
3 * Author : -
4 */
5 protected void onStart() {
6 super.onStart();
7 IntentFilter intentFilter = new IntentFilter();
8 intentFilter.addAction(MY_ACTION); // Action
9 registerReceiver(myBroadcastReceiver, intentFilter); // BroadcastReceiver
10 }
11
12 /*
13 * Function : onStop()
14 * Author : -
15 */
16 protected void onStop() {
17 unregisterReceiver(myBroadcastReceiver); // BroadcastReceiver
18 super.onStop();
19 }
なお、ActivityのonResume()メソッドにBroadcastReceiverを登録している場合は、ActivityのonPause()メソッドでBroadcastReceiverの登録を解除する必要があります.
3.3登録放送の二つの方式の違い
AndroidManifestでxmlファイルに登録されているBroadcastReceiverは、常駐型ブロードキャストに属し、アプリケーションがオフになってもブロードキャスト情報があれば作成されたBroadcastReceiverも受信できます.これは静的登録ブロードキャストの形式です
registerReceive()メソッドで登録されているBroadcastReceiverは、非常駐在型ブロードキャストに属し、通常Activityの終了時にunregisterReceiver()メソッドを呼び出してBroadcastReceiverを解除する.これは動的登録ブロードキャストの形式です