AndroidにおけるBroadcastReceiverの運用


BroadcastReceiverは、ブロードキャスト通知を受信するためのコンポーネントであり、ブロードキャストは、複数のオブジェクトを同時に通知するイベント通知メカニズムである.日常生活のラジオのように、複数の人が同時に受信したり、聞かないことを許可したりします.Androidの放送元やシステムイベント、例えば撮影ボタンを押すと、バッテリーの電力が低くなり、新しいアプリケーションをインストールしたり、特定のスレッドを起動したり、ファイルのダウンロードが完了したりします.
BroadcastReceiverクラスは、すべてのブロードキャスト受信機の抽象ベースクラスであり、実際には、送信されたブロードキャストをフィルタリングし、応答するために使用される.ブロードキャスト受信機のライフサイクルは非常に簡単で、メッセージが到着すると、受信機はonReceiver()メソッドを呼び出し、このメソッドが受信された後、BroadcastReceiverインスタンスは失効する.
ブロードキャスト受信機は、通常、独立したコンポーネントを初期化するか、onReceiver()メソッドでユーザに通知を送信する.ブロードキャスト受信機がより時間のかかる動作を完了する必要がある場合、非アクティブなブロードキャスト受信機がシステムによって停止される可能性があるため、スレッドではなくサービスを開始する必要があります.
受信ブロードキャストの2つの分類
受信に使用されるブロードキャストには、通常ブロードキャストと秩序ブロードキャストの2つのクラスがあります.
一般放送:Contextを使用する.sendBroadcast()メソッドは、完全に非同期で送信され、ブロードキャストされたすべての受信者が未定義の順序で実行され、通常は同じ時間に実行され、この方法は非常に効率的であるが、受信者は結果を使用したり、APIを終了したりすることはできない.
秩序放送:Contextを使用する.sendOrderedBroadcast()メソッドは、受信者ごとに順次実行されるため、次の受信者に結果を生成したり、他の受信者に渡さないようにブロードキャストを完全に終了したりすることができます.順序付けられた受信者の実行順序は、一致するintent-filterのandroid:priorityプロパティによって制御されます.同じ優先度を持つ受信者の実行順序はランダムです.
ブロードキャストの2つの登録メカニズム
静態登録:AndroidManifest.xmlにはラベルライフで登録し、ラベル内にラベルでフィルタを設定します.

  <receiver android:name="myRecevice">    //  BroadcastReceiver,  onReceiver  

    <intent-filter>    

      <action android:name="com.xxxx.xxx"/>//     ,    action  

      intent-filter>

  receiver> 

動的登録:
  IntentFilter intentFilter = new IntentFilter();

  intentFilter.addAction(String);   // BroadcastReceiver  action,       action   

    registerReceiver(BroadcastReceiver,intentFilter);

このように登録されたブロードキャストは、Activityのライフサイクルに従うため、Activityが終了する前にunregisterReceiver(receiver)メソッドを呼び出して削除する必要があります.
ブロードキャストターゲットAction:Intent intent=new Intent(actionString);
また、メッセージ:intentをIntentで携帯することができる.putExtra(「msg」,「hi,私はラジオでメッセージを送信しました」);
ブロードキャストメッセージの送信:Context.sendBroadcast(intent )
≪インスタンス|Instance|emdw≫
システムブロードキャストの取得
たとえば、ボタンのクリックイベントを使用して、現在のバッテリの電力量を取得します.
私たちはActivityにボタンを置いて、ボタンのクリックイベントの下で登録してブロードキャストを送信して、受信機の中でToastが現在の電力量を出します:
イベントをクリックしてコードを追加します.
  registerReceiver(new TestReceiver(),new IntentFilter(Intent.ACTION_BATTERY_CHANGED));

ブロードキャスト受信機:
public class TestReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(Intent.ACTION_BATTERY_CHANGED)) ;//  
        int level = intent.getIntExtra("level", 0);
        int scale = intent.getIntExtra("scale", 100);
        Toast.makeText(context, "     :" + (level * 100 / scale) + "%", Toast.LENGTH_SHORT).show();
    }
}

ここで注意しなければならないのは、AndroidManifestであれば、電力を取得するにはコード内で動的に登録するしかありません.xmlに静的に登録し、フィルタをandroidに設定します.intent.action.BATTERY_CHANGEDは成功しません.Androidメカニズムのせいで、保護された放送はシステムだけが送信できます.保護された放送はどれですか.http://www.cnblogs.com/xueqiang911226/p/3891852.html
私たちは自分のブロードキャスト(静的登録)を送信します.
まず、自分たちの放送受信者を実現します.
public class TestReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals("android.intent.action.MY_BROADCAST")) ;
        Toast.makeText(context, intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show();
    }
}

次に、プロファイルにブロードキャストを登録します.
  <receiver android:name=".TestReceiver">
            <intent-filter>
                <action android:name="android.intent.action.MY_BROADCAST"/>

                <category android:name="android.intent.category.DEFAULT"/>

            intent-filter>
        receiver>

次に、ボタンのクリックイベントの下でブロードキャストを送信し、上記のTestBraodcastのonReceiver()メソッドでactionをマッチングし、私たちが渡したmsgデータを読み出します.
 btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent("android.intent.action.MY_BROADCAST");
                intent.putExtra("msg", "        ");
                sendBroadcast(intent);
            }
        });

ネットワーク・ステータスのブロードキャスト・インスタンスをリスニングします.http://blog.csdn.net/centralperk/article/details/7597516
ブロードキャストを動的に登録するには、次の手順に従います.
Activityのレイアウト:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="    " />

    <Button
        android:id="@+id/btn_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="    " />
LinearLayout>


Activityのコードは次のとおりです.
public class MainActivity extends PermissionActivity {

    private Button btn1, btn2;
    TestReceiver receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }


    private void initViews() {
        btn1 = (Button) findViewById(R.id.btn_1);
        btn2 = (Button) findViewById(R.id.btn_2);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //         
                receiver = new TestReceiver();
                IntentFilter filter = new IntentFilter();
                filter.addAction("android.intent.action.MY_BROADCAST");
                registerReceiver(receiver, filter);
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //     msg   
                Intent intent = new Intent("android.intent.action.MY_BROADCAST");
                intent.putExtra("msg", "         ");
                sendBroadcast(intent);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //             。
        unregisterReceiver(receiver);
    }
}

ブロードキャスト受信機のコードは次のとおりです.
public class TestReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        //      ,                           
        //          intent              。
        if (action.equals("android.intent.action.MY_BROADCAST")) ;
        Toast.makeText(context, intent.getStringExtra("msg"), Toast.LENGTH_SHORT).show();
    }
}

秩序あるブロードキャストの例:
私たちはActivityにそれぞれ3つの異なる優先度のブロードキャストを登録します.次に、対応する3つのブロードキャスト受信機を作成し、ログを印刷して順序を確認します:Activityコード:
public class MainActivity extends PermissionActivity {

    private Button btn1, btn2;
    TestReceiver receiver = new TestReceiver();
    TestReceiver1 receiver1 = new TestReceiver1();
    TestReceiver2 receiver2 = new TestReceiver2();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
    }


    private void initViews() {
        btn1 = (Button) findViewById(R.id.btn_1);
        btn2 = (Button) findViewById(R.id.btn_2);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //         

                IntentFilter filter = new IntentFilter();
                filter.addAction("android.intent.action.MY_BROADCAST");
                filter.setPriority(999);
                registerReceiver(receiver, filter);

                IntentFilter filter1 = new IntentFilter();
                filter1.addAction("android.intent.action.MY_BROADCAST");
                filter1.setPriority(998);
                registerReceiver(receiver1, filter1);

                IntentFilter filter2 = new IntentFilter();
                filter2.addAction("android.intent.action.MY_BROADCAST");
                filter2.setPriority(997);
                registerReceiver(receiver2, filter2);
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //     msg   
                Intent intent = new Intent("android.intent.action.MY_BROADCAST");
                intent.putExtra("msg", "         ");
//                sendBroadcast(intent);
                MainActivity.this.sendOrderedBroadcast(intent,null);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //             。
        unregisterReceiver(receiver);
        unregisterReceiver(receiver1);
        unregisterReceiver(receiver2);
    }
}

Activityのxmlコード:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="    " />

    <Button
        android:id="@+id/btn_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="    " />
LinearLayout>


3つのブロードキャスト受信機のコードは、次のとおりです.
public class TestReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        //      ,                           
        //          intent              。
        if (action.equals("android.intent.action.MY_BROADCAST")) ;
        //    Bundle  ,     
        Bundle bundle = new Bundle();
        bundle.putString("msg", intent.getStringExtra("msg"));
        // bundle     
        setResultExtras(bundle);
        //  Broadcast     
        Log.i("receiver0",intent.getStringExtra("msg"));
    }
}
public class TestReceiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        //      ,                           
        //          intent              。
        if (action.equals("android.intent.action.MY_BROADCAST")) ;
        Bundle bundle = getResultExtras(true);
        //     BroadcastReceiver    key first   
        String first = bundle.getString("msg");
        Log.i("receiver1", first);
//            
//        Bundle bundle1 = new Bundle();
//        bundle1.putString("msg", first);
//        // bundle     
//        setResultExtras(bundle1);
    }
}
public class TestReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        //      ,                           
        //          intent              。
        if (action.equals("android.intent.action.MY_BROADCAST")) ;
        Bundle bundle = getResultExtras(true);//            
        String str= bundle.getString("msg");
        Log.i("receiver2",str);
        abortBroadcast();//        
    }
}

もちろん、私たちは同じ情報を順番に受信するだけです.受信機ごとにログを直接印刷しますi(“receiver0/1/2”,intent.getStringExtra(“msg”)); 順番に送信されていることがわかり、Activityにfilterを注釈します.setPriority(999);のいくつかの文、あるいは中の数値を同じに変更すると、無秩序であるかどうかを検証することができます.【もちろんabortBroadcast()メソッドを注釈する必要があります.そうしないと、BroadcastReceiver trying to return result during a non-ordered broadcast異常を報告します】