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対象にフィルタリングブロードキャストの動作を加えることができる.具体的な実装方法は、次のコードで示されています.
 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>

タグは<アプリケーション>タグにネストされており、android:name=「.MyBroadcastReceiver」は登録するBroadcastReceiverコンポーネントの名前を指定しています.ラベルのラベルは、BroadcastReceiverコンポーネントのフィルタルールを指定するために使用されます.このラベルのandroid:name=「com.example.android_broadcast.msg」は、私たちが以前定義したブロードキャスト動作であることがわかります.これにより、MyBroadcastReceiverが応答するブロードキャスト動作が唯一決定される.
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を解除する.これは動的登録ブロードキャストの形式です