AndroidフリップフロップコンポーネントBroadcastReceiverの詳細

7639 ワード

目次
  • ディレクトリ
  • 概要
  • BroadcastReceiverの使用
  • BroadcastReceiverのサブクラス
  • を作成する
  • BroadcastReceiverの登録
  • 静的登録
  • 動的登録

  • 放送の送信
  • 概要
    BroadcastReceiverは、Androidの4つのコンポーネントの1つであり、システムのブロードキャストメッセージを傍受するために使用されます.BroadcastReceiverの使用は非常に簡単で、動作方式では関数に近い.BroadcastReceiverオブジェクトが構築されると、通常はBroadcastReceiverのみが実行する.onReceiveメソッドは、自分のライフサイクルを終了します.BroadcastReceiverはシステムのグローバルブロードキャストをリスニングできるため、BroadcastReceiverは異なるプロセスコンポーネント間の通信に使用できます.
    また、BroadcastReceiverコンポーネントオブジェクトも、すべてのコンポーネントと同様にアプリケーションプロセスのメインスレッドで構築されているため、その機能関数onReceiveの実行は同期で迅速でなければならない.そうしないと、ユーザーと対話する現在のプロセスがブロックされ、ユーザー体験に影響を与える.
    BroadcastReceiverの設計は,バックグラウンドイベントの傍受というアプリケーション開発における重要な問題を解決した.例えば、以前のSymbianで着信ホームプロンプトなどのアプリケーションを行うには、アプリケーションプロセスを常に実行させ、バックグラウンドサイクルで関連イベントの発生を待つ必要があります.このようにシステム資源を浪費しやすく、殺されやすい.一方、BroadcastReceiverのAndroidでは、イベントが実際に発生した場合にのみ、コンポーネント管理サービスが構成情報に基づいて対応するトリガコンポーネントオブジェクトを通知し、コンポーネントを実行するプロセスを構築します.
    BroadcastReceiverの使用
    BroadcastReceiverのサブクラスの作成
    まず、独自のBroadcastReceiverサブクラスを構築し、androidから継承する必要がある.content.BroadcastReceiverクラスは、onReceiveメソッドを実装します.サンプルコードは次のとおりです.
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        private static final String MY_ACTION = "system.update";
    
        public MyBroadcastReceiver() {
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            if (MY_ACTION.equals(intent.getAction())) {
                // TODO:           ,           
            }
        }
    }

    BroadcastReceiverの登録
    独自のBroadcastReceiverサブクラスがあれば登録する必要があります.BroadcastReceiverを登録する方法は、次の2つです.
  • 静的登録.
  • 動的登録.

  • 静的登録
    静的登録とは、フリップフロップコンポーネントに関する情報をアプリケーションのAndroidManifestに書き込むことである.xmlファイルにあります.このように登録されたブロードキャストは、常駐型ブロードキャストと呼ばれ、すなわちアプリケーションが閉じた場合、対応するイベントがトリガーされると、ブロードキャストのonReceiveメソッドがシステムによって自動的に呼び出されて実行される.
    たとえば、起動イベント、着信イベント、新しいメッセージイベントをリスニングする必要がある場合は、静的登録が使用されます.サンプルコードは次のとおりです.
            <receiver  android:name=".MyBroadcastReceiver" android:enabled="true" android:exported="true" >
                <intent-filter>
                    <action android:name="android.intent.action.MyBroadcastReceiver" />
    
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </receiver>

    ここではandroid:enabledとandroid:exportedの2つのプロパティの役割について説明します.
  • android:enabled:このbroadcast receiverがシステムによってインスタンス化できるかどうか.デフォルトはtrueです.
  • android:exported:broadcast receiverが外部アプリケーションからのメッセージを受信できるかどうか.受信可能はtrue、そうでなければfalseです.falseの場合、broadcast receiverは、同じアプリケーションまたは同じユーザIDのアプリケーションのコンポーネントから送信されたメッセージしか受信できません.このデフォルト値はbroadcast receiverがintent filtersを含むかどうかに依存します.intent filterが欠けている場合は、クラス名を正確に指定して呼び出すしかないことを意味します(ps:通常、broadcast receiverはアプリケーションの内部でのみ使用できることを意味します.外部アプリケーションはクラス名を正確に知ることができないためです).この場合、デフォルト値はfalseです.intent filterの構成がある場合、broadcast receiverは、システムの他のアプリケーションからそのintentを含むブロードキャストを受信できることを示します.したがって、この場合のデフォルト値はtrueです.

  • 動的登録
    動的登録は.JAvaファイルに登録します.このように登録されたブロードキャストは、Activityのライフサイクルに従う非常駐在型ブロードキャストと呼ばれています.通常、ActivityのonCreateメソッドで初期化し、onResumeメソッドで登録し、onPauseメソッドで登録をキャンセルします.サンプルコードは次のとおりです.
    public class MainActivity extends Activity{
        private MyBroadCastReceiver myBroadCastReceiver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.settings_main_prefs);
            //      
            myBroadCastReceiver = new MyBroadCastReceiver();
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.e("TAG", "main activity on resume!");
            //     ,     intent
            registerMyBroadcastReceiver();
        }
    
        private void registerMyBroadcastReceiver() {
            IntentFilter filter = new IntentFilter();
            filter.addAction("android.intent.action.MyBroadcastReceiver");
            registerReceiver(myBroadCastReceiver, filter);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.e("TAG", "main activity on Pause!");
            //     
            unregisterReceiver(myBroadCastReceiver);
        }
    }

    放送の送信
    BroadcastReceiverは放送の受信に使用されますが、ここでは放送の送信についても紹介する必要があります.
    Androidのイベント放送には2つのモードがあります.
  • はContext.sendBroadcastメソッドは、通常のブロードキャストモードと呼ばれる送信を行う.このモードでは、ブロードキャストイベントが登録されているBroadcastReceiverはすべてイベント通知を取得し、それぞれのアプリケーションプロセスで同時に実行される.
  • もう1つはContext.sendOrderedBroadcastメソッドは、秩序化ブロードキャストモードと呼ばれる送信を行う.イベントをリスニングするすべてのトリガコンポーネントは、設定された優先度に従ってソートされ、イベントは高い順から低い順に処理されます.優先度の高いフリップフロップコンポーネントはBroadcastReceiverを通過することができる.abortBroadcastメソッドは、このブロードキャストイベントの伝播を終了させ、低優先度のトリガコンポーネントがイベントを処理する機会を与えないようにする.

  • AndroidManifestでxmlファイルのラベルにandroid:priorityプロパティ設定の優先度を追加するか、IntentFilterクラスインスタンスでsetPriorityメソッド設定の優先度を呼び出すことができます.