Android-BroadcastReceiver詳細


Broadcastとは
ブロードキャストはブロードキャストであり、Android放送では非常に重要な機能です.例えば、システムの電源を入れた後に何かをしたい、携帯電話の電力量を監視したい、携帯電話のネットワーク状態を監視したいなど、これらの機能は放送に使用する必要があります.もちろん、ラジオをカスタマイズすることもできます.
カスタムブロードキャスト
通常、簡単なカスタムブロードキャストを実装するには、次の手順に従います.
  • クラス継承androidを作成します.content.BroadcastReceiver、onReceiveメソッド
  • を実装
  • はAndroidManifestにあります.xmlに登録するブロードキャスト
  • ContextのregisterReceiver等によりブロードキャスト
  • を登録する.
  • ContextのsendBroadcastなどのメソッドを呼び出してブロードキャストを送信し、onReceiveメソッドでブロードキャスト
  • を処理する
  • ContextのunregisterReceiverを呼び出すなどの方法でブロードキャスト
  • をログアウトする.
    上記の手順をコードで説明します.
    1.クラス継承androidを作成します.content.BroadcastReceiver、onReceiveメソッドを実装
    package com.mark.broadcastreciver;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    /** *                 android.content.BroadcastReceiver, *    onReceive    。 */
    public class MyReceiver extends BroadcastReceiver {
    
        private final static String TAG = MyReceiver.class.getSimpleName();
    
        public MyReceiver() {
        }
    
        /** *                * @param context       * @param intent   sendBroadcast(intent)   Intent  ,     action、        */
        @Override
        public void onReceive(Context context, Intent intent) {
            //   msg     
            String msg = intent.getStringExtra("msg");
            //   msg  
            Log.i(TAG, "msg = " + msg);
            //   action   
            Log.i(TAG, "action = " + intent.getAction());
        }
    }

    2.AndroidManifest.xmlにブロードキャストを登録する
    <application>
        <receiver android:name=".MyReceiver">
        </receiver>
    </application>

    3.ContextのregisterReceiver等によりブロードキャスト4を登録する.ContextのsendBroadcastなどのメソッドを呼び出してブロードキャストを送信し、onReceiveメソッドでブロードキャスト5を処理する.ContextのunregisterReceiverを呼び出すなどの方法でブロードキャストをログアウトする
    package com.mark.broadcastreciver;
    
    import android.content.BroadcastReceiver;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    
    public class MainActivity extends AppCompatActivity {
    
        BroadcastReceiver registerReceiver;
        IntentFilter intentFilter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //   BroadcastReceiver  
            registerReceiver = new MyReceiver();
            //   IntentFilter,   action com.mark.broadcast.receiver,        
            intentFilter = new IntentFilter("com.mark.broadcast.receiver");
            //      registerReceiver intentFilter  ,
            // registerReceiver     action com.mark.broadcast.receiver   
            registerReceiver(registerReceiver, intentFilter);
    
            findViewById(R.id.btnRegister).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //     
    
                    //   Intent,   action com.mark.broadcast.receiver, registerReceiver   action  
                    Intent intent = new Intent("com.mark.broadcast.receiver");
                    //         
                    intent.putExtra("msg", "Hello, a new message.");
                    sendBroadcast(intent);
                }
            });
    
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(registerReceiver);
        }
    }

    上記の手順でカスタムブロードキャストを実現し、Buttonをクリックするとコンソールに次の情報が表示されます.
    04-13 17:12:28.591 16882-16882/com.mark.broadcastreciver I/MyReceiver: msg = Hello, a new message.
    04-13 17:12:28.591 16882-16882/com.mark.broadcastreciver I/MyReceiver: action = com.mark.broadcast.receiver

    ブロードキャストの登録
    ブロードキャストを登録する方法は、静的登録と動的登録の2つです.
    静的登録
    この方法はAndroidManifestを配置することである.xmlプロファイルに登録されています.このように登録されているブロードキャストは常駐型ブロードキャストです.つまり、アプリケーションが閉じた場合、対応するイベントがトリガーされると、プログラムはシステムによって自動的に呼び出されて実行されます.例:
    <!--         BroadcastReceiver     Intent -->
    <receiver android:name=“.MyReceiver">
        <intent-filter>
            </action>
            <action android:name=“com.mark.broadcast.reveiver”/>
            <category android:name="android.intent.category.DEFAULT"></category>
        </intent-filter>
    </receiver>

    動的登録
    この方法はコードを介している.Javaファイルに登録します.このように登録されたブロードキャストは、Activityのライフサイクルに従うため、Activityが終了する前にunregisterReceiver(receiver)メソッドを呼び出して削除する必要があります.例:
    //   BroadcastReceiver  
    registerReceiver = new MyReceiver();
     //   IntentFilter,   action com.mark.broadcast.receiver,        
     intentFilter = new IntentFilter("com.mark.broadcast.receiver");
     //      registerReceiver intentFilter  ,
     // registerReceiver     action com.mark.broadcast.receiver   
    registerReceiver(registerReceiver, intentFilter);

    注意:ActivityにBroadcastReceiverを登録した場合、このActivityが破棄された場合、登録を自発的に取り消す必要があります.そうしないと異常が発生します.方法は次のとおりです.
    @Override
        protected void onDestroy() {
            super.onDestroy();
            unregisterReceiver(registerReceiver);
        }

    ブロードキャストのタイプ
    Broadcastのタイプには、通常放送と秩序放送の2種類があります.
    Normal broadcasts(一般放送)
    Normal broadcastsは完全に非同期であり、すべての受信者に同じ時間に受信されることができる.メッセージの伝達効率が高い.しかし、欠点は、受信者が受信したメッセージの処理情報を次の受信者に伝えることも、メッセージの伝播を停止することもできないことである.複数の一般放送が同じIntentFilterを設定すると、先に登録されたものが先に放送を受信する.
    Ordered broadcasts(秩序放送)
    Ordered broadcastsの受信者は、一定の優先度でメッセージの受信を行う.例えば、A,B,Cの優先度が順次低下すると、メッセージはまずAに伝達され、Bに伝達され、最後にCに伝達される.「優先度宣言」では、[-10001000]の値が大きいほど優先度が高くなります.優先度はfilterでもよい.setPriority(10)方式で設定します.
    また、Ordered broadcastsの受信者はabortBroadcast()でブロードキャストの伝播をキャンセルしたり、setResultDataとsetResultExtras法で処理の結果をBroadcastに格納して次の受信者に渡したりすることができる.次に、次の受信者は、getResultData()およびgetResultExtras(true)を介して、優先度の高い受信者が格納したデータを受信する.
    例:
    <receiver  android:name=".FirstReceiver">
    
        <intent-filter  android:priority="999">
            <action android:name="com.mark.broadcast.receiver" />
    
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    <receiver android:name=".MyReceiver" >
        <intent-filter  android:priority="1000">
            <action android:name="com.mark.broadcast.receiver" />
    
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

    上記の2つのreceiverはそれぞれpriority 999と1000に設定されており、タイムリーにMyReceiverは後登録されていますが、FirstReceiverより優先度が高い場合はMyReceiverがブロードキャストを先に処理します.
    sendOrderedBroadcast送信秩序化ブロードキャスト
    sendOrderedBroadcast(intent,receiverPermission)メソッドは、通常のブロードキャストの送信方式よりも1つのreceiverPermissionパラメータを受信します.これはStringタイプのパラメータで、この権限を持つReceiverを代表してブロードキャストを受信することができます.nullの場合、指定した権限を受信者に宣言する必要はありません.具体的な操作を見てみましょう.
    まず、次のような権限をカスタマイズします.
    <permission  android:name="com.permissions.MY_BROADCAST_RECEIVER" android:protectionLevel="normal" />

    次に、現在のプログラムにこの権限がある場合は、次のようにします.
    <uses-permission android:name="com.permissions.MY_BROADCAST_RECEIVER" />

    これにより、現在のプログラムにはこの権限があります.
    私たちが秩序あるブロードキャストを送信するには、その権限をcomと指定します.permissions.MY_BROADCAST_RECEIVER、スペルを間違えないように注意して、コピーしたほうがいいです.次のようにブロードキャストを送信します.
    //   Intent,   action com.mark.broadcast.receiver, registerReceiver   action  
    Intent intent = new Intent("com.mark.broadcast.receiver");
    //         
    intent.putExtra("msg", "Hello, a new message.");
    sendOrderedBroadcast(intent, "com.permissions.MY_BROADCAST_RECEIVER");

    これにより、ブロードキャストを送信し、その権限をcomと指定する.permissions.MY_BROADCAST_RECEIVERは、現在のプログラムでこの権限が使用されているため、現在のプログラムのreceiverはこのブロードキャストを受信して処理することができます.このブロードキャストは受信できません.ここでの権限はandroidのセキュリティ重視を体現している.
    sendStickyBroadcast粘性放送
    スティッキー放送と他の放送方式の最大の違いは「非同期」である.すなわち、1つのスティッキー放送が送信された後、Receiverを処理しなくてもよいが、この放送はずっと存在し、しばらくしてからReceiverがこの放送を登録していれば、このReceiverはこの放送を処理することができる.しかし、注意深い友人たちはsendStickyBroadcastの一連のリロード方法のパラメータに上記のreceiverPermissionパラメータがないことを見ることができ、これも粘性放送の安全性に問題がある.したがって、API Level 21にはsendStickyBroadcastメソッドがdeprecatedと表記されている.すなわち、スティッキーブロードキャストの使用は推奨されていない.安全性やその他の面で粘性放送には多くの欠陥があるからだ.ここでは私たちも重点的に議論しません.
    まとめ
    ここでは,放送および放送受信者について簡単なまとめと,使用時の注意点について述べる.
    1.ブロードキャストを送信方法はすべてContextWrapperの中の方法であり、Activity、ServiceはすべてContextWrapperのサブクラスであるため、それらの中でブロードキャストを送信登録することができる.onReceiveメソッドでは時間のかかる操作はできません.そうしないとANR 3にもなります.実際の開発の必要に応じて、できるだけ放送に権限を加える.粘性放送5の使用はできるだけ避ける.秩序放送の優先度は【−1000〜1000】であり、数値が大きいほど優先度が高くなる
    上記の説明といくつかの観点は正解ではないかもしれませんが、参考にして、皆さんの指摘、批判を歓迎します.