Android四大コンポーネントのBroadcastReceiver学習

5072 ワード

一、BroadcastReceiver概要
1.BroadcastReceiverはAndroidの4つのコンポーネントの1つです.一般的には、インベントリファイルに静的登録を行います.ただし、ブロードキャスト受信者のみがjavaコードに動的に登録できる2.BroadcastReceiverはブロードキャストを受信するためのコンポーネントであり、コンポーネントとコンポーネントの間で通信するために使用され、アプリケーションにまたがって伝えることができる3.ブロードキャストの送信適用の場合:送信周波数が低い場合に使用され、データ量が小さい場合に使用される.intentはあまり大きなデータを携帯できないためである.
二、受信ブロードキャスト2.1静的登録ブロードキャスト受信者
1.リストファイルに配置する2.静的に登録されたブロードキャストのプログラムを1回実行した後も、以降はブロードキャスト受信の状態を維持することができ、対応するブロードキャストがあればそのブロードキャスト情報を受信することができる
2.2ブロードキャスト受信者の動的登録
  • 動的に登録するブロードキャストは、プログラムの実行中にのみブロードキャスト
  • を受信することができる.
  • まず、ブロードキャストに伴うintentのデータ2.2を取得してintent.getAction()が所望のactionと等しいかどうかを判断するonReceive()メソッドを実装する自己受信クラスextend BroadcastReceiverクラス2.1を記述する.説明状態変更2.2.2ネットワークマネージャオブジェクトに従って対応するネットワーク状態を得る2.2.3対応する状態でhandlerを使用してメッセージを送信する3.登録ブロードキャストを書く方法3.1 newカスタムブロードキャスト受信クラスオブジェクト3.2 new 1 IntentFilter.addAction(ConnectivityManagement.CONNECTIVE_ACTION)3.4 registerReceiver(ブロードキャスト受信クラスオブジェクト、filter);登録する
  • 登録ブロードキャストActivity初期化時に登録ブロードキャスト対応の方法を書き、ブロードキャストの登録を完了する5.特定の場所で登録を解除する必要がある5.1 registerReceiverはContextWrapperクラスのメソッドであり、ActivityとServiceはいずれもContextWrapperを継承しているので直接呼び出すことができ、実際のアプリケーションではActivityとServiceにBroadを登録しているcastReceiver、このActivityまたはServiceが破棄された場合は、ブロードキャストの登録が解除されていない場合は、システムは、登録を解除することを忘れたことを示す異常を報告します.5.2一般的にページ破棄時にunregisterReceiver(カスタムブロードキャストクラスのオブジェクト)に接触して登録します.6.リスニングネットワークのインスタンスコード
  •   public class NetBroadcastReceiver extends BroadcastReceiver {
           @Override
           public void onReceive(Context context, Intent intent) {
                 //                   
                 if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
                             int netMobile = NetUtil.getNetWorkState(context);
                                if (netMobile == 1) {
                                     handler.sendEmptyMessage(500);
                               // Toast.makeText(LiveActivity.this, "  ", Toast.LENGTH_SHORT).show();
                               } else if (netMobile == 0) {
                               // Toast.makeText(LiveActivity.this, "  ", Toast.LENGTH_SHORT).show();
                                     handler.sendEmptyMessage(500);
                               } else if (netMobile == -1) {
                                     handler.sendEmptyMessage(501);
                               // Toast.makeText(LiveActivity.this, "       ,      ", Toast.LENGTH_SHORT).show();
                               }
                       }
              }
      }
    
    /**
    *       
    */
    private static final int NETWORK_NONE = -1;
    /**
    *     
    */
    private static final int NETWORK_MOBILE = 0;
    /**
    *     
    */
    private static final int NETWORK_WIFI = 1;
    
    
    public static int getNetWorkState(Context context) {
              //          
           ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                      NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
                           if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
                            if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
                                      return NETWORK_WIFI;
                               } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
                                      return NETWORK_MOBILE;
                               }
                           } else {
                                      return NETWORK_NONE;
                           }
                return NETWORK_NONE;
    }
    
    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 500:
                    netTag = 1;
                    break;
                case 501:
                    netTag = 2;
                    break;
            }
        }
    };
    //        netTag  ,          ```
    
    /**
    *     
    */
    private void registBroadcast() {
        receiver = new NetBroadcastReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(receiver, filter);
    }   
    

    2.3放送受信者優先度についての説明
    1.静的コードブロックで定義する2.動的javaコード設定filter.setPriority(…)3.優先度の値が大きいほど優先度が高くなる3.1ネット上でpriorityの最大値は1000と言いますが、2147483647 3.2優先度の範囲は-2114748647から2147483647で、ちょうどその長さ範囲はIntegerタイプデータの最大値4294967296(2の32乗)です
    三、放送を送る
    3.1通常放送(無秩序放送)1.無秩序放送は複数の受信者にとって完全に非同期であり、通常は各受信者が待つことなく放送を受信し、受信者間では影響を及ぼさないが、このような無秩序放送では、受信者は放送を終了することができず、すなわち他の受信者の受信動作を阻止することができない2.sendBroadcast(intent)Intent intent=new Intent("......")intent.putExtra("xxx","xxx")sendBroadcast(intent);3.遅延できない4.ブロックできない
    3.2秩序放送
    1.優先度の高い受信者に送信されるたびに、優先度の高い受信者によって優先度の低い受信者に伝播され、優先度の高い受信者はこの放送を終了する能力があり、優先度は受信者登録時に設定(静的および動的)することができる2.setOrderdBroadcast(intent,permission)permissionは一般的にnullであり、追加の権限は必要ないことを示している.空でなければ、すべての受信者にこの権限が必要である.3.遅延可能である.4.ブロック方法abortBroadcast();//受信者のOnReceive()でブロックできる
    最後に著者は、これは私が書いた最初の文章で、あまり使えない感じがして、書くのが間違っています.指摘を歓迎します.