Android学習(3)-4大コンポーネントのBroadcastReceiver

10143 ワード

BroadcastReceiverベースの使用
  • BroadcastReceiverベース使用
  • BroadCastReceiver概要
  • BroadcastReceiverの実現原理
  • BroadcastReceiver
  • を定義
  • BroadcastReceiverの登録
  • 静的登録
  • 動的登録
  • 静的登録と動的登録の違い
  • ブロードキャスト
  • を送信
  • onReceiveContext contextIntent intentメソッド
  • について

    BroadCastReceiverの概要
    ブロードキャスト受信機(BroadCastReceiver)は、プライマリ・スレッドで実行され、グローバル・ブロードキャストを監視します.
    Androidの4つのコンポーネントの1つとして、BroadCastReceiverは重要な役割を果たしています.一般的には、プッシュを受信したり、プロセス間通信などの直接通信操作が不便な場所や、不定時に完了したトランザクションを傍受したりするために使用されます.
    放送には主に2種類あります.秩序放送と無秩序放送です.
  • 無秩序放送:放送のintentに一致するすべての放送受信者はこの放送を受信することができ、しかも前後順がなく、効率的に行うが、受信者は放送
  • を伝達することができず、遮断することもできない.
  • 秩序放送:放送のintentに一致するすべての放送受信者はこの放送を受信することができるが、放送受信者の優先度に従って受信の前後順序を決定し、各受信者は修正して修正した放送を次の受信者に伝える権利があり、ブロックすることもできる.

  • BroadcastReceiverの実現原理
    以前使っていたときは実現原理は気にしていませんでしたが、知っていました.
    ブロードキャストの設計モードは標準的なオブザーバモードであり、ブロードキャストにとって最も重要なのはAndroidのAMS(ActivityManagerService)であり、メッセージ配信者はAMSに登録され、Binderメカニズムによってブロードキャストが送信され、AMSは登録リストで適切な受信者を見つけ、ブロードキャストを受信者のメッセージループキュー(BroadcastQueue)に送信し、ブロードキャスト受信者はメッセージループを通じてブロードキャストを受け取り、コールバックメソッドonReceive()を呼び出す.
    Created with Raphal2.1.0パブリッシャーAMS受信者受信者登録ブロードキャスト適切な受信者を探して適切な受信者を見つけてブロードキャストを受信者メッセージキューメッセージループに送信
    この観察者モードはキックアスで、びっくりして急いでこの設計モードがどのように使われているかを見に行きました.
    BroadcastReceiverの定義
    ブロードキャスト受信機を定義するのは簡単です
  • まずクラスを新規作成し(個別ファイルのクラスか内部クラスかは使用シーンによって異なりますが)、BroadcastReceiverクラス
  • を継承します.
  • 書き換え中のonReceiveメソッド
  • public class MyBroadcastReceiver extends BroadcastReceiver {
    
     @Override
     public void onReceive(Context context, Intent intent) {
         //        
         } 
    }

    BroadcastReceiverの登録
    Androidの4つのコンポーネントの1つとして、あなたのActivityとServiceはすべてManifestの中で登録して、私のBroadcastReceiverは登録しないならば、私はメンツが要りませんか?
    BroadcastReceiverの登録には、静的登録と動的登録の2種類があります.
    静的登録
    静態登録実AndroidManifestにラベルを追加
    <receiver
         //               truefalse       
        android:enabled=["true" | "false"]
        //          APPintent-filter      truefalse
        android:exported=["true" | "false"]
        //            ,      application   icon
        android:icon="drawable resource"
        android:label="string resource"//  
        //                  (  ,       ;    .CLASSNAMEmanifestandroid:name="string"
        //                                。
        android:permission="string"android:process="string">
        <intent-filter>
            //   action,             
            <action android:name="actionName" />
        intent-filter>
    receiver>
    

    このappが最初に起動すると、ブロードキャスト受信機の実装クラスが自動的にインスタンス化され、システムに登録されます.
    動的登録
    マニフェストにラベルを付けず、コードにContextを動的に呼び出すregisterReceiver()メソッドです.
    private MyBroadcastReceiver mBroadcastReceiver;
    
    @Override 
    protected void onResume(){ 
        super.onResume(); 
        mBroadcastReceiver = new MyBroadcastReceiver ();
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE); 
    
        registerReceiver(mBroadcastReceiver, intentFilter); 
    } 
    
    @Override 
    protected void onPause() { 
        super.onPause(); 
        unregisterReceiver(mBroadcastReceiver); 
    } 

    動的ブロードキャストはメモリ漏洩防止のためにログアウトが必要なのでonResumeメソッドに登録することを推奨し、onPauseメソッドにログアウトすると同時に重複登録し、重複ログアウトも許可しない
    onResume()に登録、onPause()のログアウトは、onPause()がAppが死ぬ前に必ず実行されるため、ブロードキャストがAppが死ぬ前にログアウトされることを保証し、メモリ漏洩を防止します.
    静的登録と動的登録の違い
  • 両方式の登録方式が異なる
  • 静的:manifestに
  • を登録する
  • 動的:コードに
  • を登録する
  • 両方式の傍受範囲が異なる
  • 静態:ブロードキャスト
  • を常時傍受する
  • 動的:特定の時点でブロードキャスト
  • を傍受する
  • のライフサイクルが異なります
  • 静的:バックグラウンドに常駐し、コンポーネントのライフサイクルの影響を受けず、消費電力がメモリに多く含まれる
  • 動的:部常駐、柔軟、コンポーネントのライフサイクル変化に従い、いったん除去するとブロードキャスト
  • を受け入れない

    ブロードキャストの送信
    ブロードキャストはsendBroadcast()メソッドによりIntentを伝送ツールとして送信される
    放送は主に5種類に分けられます.
  • 一般放送
  • システムブロードキャスト
  • 秩序放送
  • 粘性放送
  • アプリケーション内ブロードキャスト
  • 一般放送
        Intent intent = new Intent();
        intent.setAction(NROMAL_ACTION);
        sendBroadcast(intent);

    NROMAL_ACTIONはあなたが前に登録した放送イベントです
    システムほうそう
    これは手動で送信するのではなく、システムがデフォルトで送信しているので、傍受するだけでいいです.
    具体的な操作
    アクション名
    ネットワークの変化を監視
    android.net.conn.CONNECTIVITY_CHANGE
    フライトモードをオフまたはオンにする
    Intent.ACTION_AIRPLANE_MODE_CHANGED
    充電時または電力量が変化する
    Intent.ACTION_BATTERY_CHANGED
    バッテリ消費電力が低い
    Intent.ACTION_BATTERY_LOW
    バッテリーの充電量が十分である(すなわち、低消費電力から満タンに変化した場合に放送される)
    Intent.ACTION_BATTERY_OKAY
    システム起動完了後(1回のみ放送)
    Intent.ACTION_BOOT_COMPLETED
    写真撮影時の撮影ボタン(ハードウェアボタン)を押すと
    Intent.ACTION_CAMERA_BUTTON
    スクリーンロック
    Intent.ACTION_CLOSE_SYSTEM_DIALOGS
    デバイスの現在の設定が変更された場合(インタフェース言語、デバイス方向など)
    Intent.ACTION_CONFIGURATION_CHANGED
    イヤホン挿入時
    Intent.ACTION_HEADSET_PLUG
    SDカードが正しく取り外されていないが取り出された場合(正しく取り外される方法:設定–SDカードとデバイスメモリ–SDカードのアンインストール)
    Intent.ACTION_MEDIA_BAD_REMOVAL
    SDカードなどの外部記憶装置の挿入
    tent.ACTION_MEDIA_CHECKING
    APKの正常なインストール
    Intent.ACTION_PACKAGE_REMOVED
    APKの削除に成功しました
    Intent.ACTION_BATTERY_CHANGED
    デバイスの再起動
    Intent.ACTION_REBOOT
    画面が閉じられました
    Intent.ACTION_SCREEN_OFF
    画面が開きます
    Intent.ACTION_SCREEN_ON
    システムを閉じるとき
    Intent.ACTION_SHUTDOWN
    デバイスの再起動
    Intent.ACTION_REBOOT
    システムブロードキャストを使用する場合は、ブロードキャスト受信者を登録する際に関連するactionを定義するだけでよく、手動でブロードキャストを送信する必要はなく、システムに関連する操作がある場合に自動的にシステムブロードキャストを行う
    ちくじほうそう
    送信された放送は放送受信者によって前後順に受信され,ここでの順序は受信者に対するものである.
  • 放送受信の順序規則
  • Priority属性の値に従って、大きいから小さいまで
  • 並べ替えます.
  • Priority属性の値と同時に、動的に登録されたブロードキャスト優先

  • 使用方法
    sendOrderedBroadcast(intent);

    アプリケーション内ブロードキャスト
  • ブロードキャスト登録時にexported属性をfalseに設定し、本App内部で発行されていないブロードキャストが受信されないようにする.
  • がブロードキャストを送信ときにそのブロードキャスト受信機が存在するパケット名を指定し、このパケットのApp内で一致する有効なブロードキャスト受信機にのみ、intentを介して送信.setPackage(packageName)指定応募
  • ブロードキャストの送信と受信時に、対応する権限permissionを増設し、権限検証に使用する.
    上記以外にもLocalBroadcastManagerをご利用いただけます
  • 使用方式はグローバルブロードキャストとほぼ同じであるが、登録/登録解除ブロードキャスト受信機と送信ブロードキャスト時にパラメータのcontextをLocalBroadcastManagerの単一インスタンスとして使用し、LocalBroadcastManager方式で送信されるアプリケーション内ブロードキャストについてはLocalBroadcastManagerによる動的登録のみであり、
  • を静的に登録することはできない.
        //           
        //  1:   BroadcastReceiver   & IntentFilter 
        MyBroadcastReceiver mBroadcastReceiver = new MyBroadcastReceiver ();
        IntentFilter intentFilter = new IntentFilter();
        localBroadcastManager = LocalBroadcastManager.getInstance(this); 
        //  3:          
        intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE); 
        //  4:  LocalBroadcastManager     registerReceiver()         
        localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter); 
        //             
        localBroadcastManager.unregisterReceiver(mBroadcastReceiver);
         //        
        intent.setAction(BROADCAST_ACTION);
        localBroadcastManager.sendBroadcast(intent);
    

    onReceive(Context context,Intent intent)メソッドについて
    異なる登録方式のブロードキャスト受信機コールバックOnReceive(Context context,Intent intent)におけるcontext戻り値は異なる
  • 静的登録(グローバル+アプリケーション内ブロードキャスト)について、コールバックonReceive(context,intent)のcontext戻り値は、ReceiverRestrictedContext;
  • グローバルブロードキャストの動的登録について、コールバックonReceive(context,intent)のcontext戻り値は、Activity Context;
  • アプリケーション内ブロードキャストの動的登録(LocalBroadcastManager方式)、コールバックonReceive(context,intent)のcontext戻り値は、Application Contextである.
  • アプリケーション内ブロードキャストの動的登録(非LocalBroadcastManager方式)、コールバックonReceive(context,intent)のcontext戻り値は、Activity Context;