Android開発22――放送受信者BroadcastReceiverの原理と登録


一、放送メカニズムの基本概念
あるイベントが発生すると(メールが来たり、電話がかかってきたり)、androidオペレーティングシステムは、登録されているすべてのブロードキャスト受信者にこのイベントをブロードキャストし、このイベントを処理するブロードキャスト受信者が処理する必要があります.実はこれが日常生活のラジオです.あるニュースが発生すると、ラジオ局はこのニュースをラジオをつけた人に放送し、このニュースに興味のある人は注目し、メモを取るかもしれません.ニュースは事件であり、放送局はandroidシステムであり、ラジオをつけた人は放送受信者であり、興味のある人はその事件を処理しなければならない放送受信者であり、メモを取ることはその事件に対する操作である.
二、放送の分類――普通放送と秩序放送
①通常放送:完全非同期であり、論理的に任意の放送受信者に受信される.利点は効率が高いことです.欠点は、受信者が処理結果を次の受信者に渡すことができず、ブロードキャストintentの伝播を終了することができないことである.
②秩序放送:被受信者の優先順位順に、被受信者に一度に伝播する.例えば、3つのブロードキャスト受信者A,B,Cがあり、優先度はA>B>Cである.では、このニュースはまずAに伝えてから、Bに伝えて、最後にCに伝えます.各受信者は、Bがブロードキャストを終了するなど、ブロードキャストを終了する権利を有し、Cは受信できない.また、Aは、放送を受信した後に結果オブジェクトを操作することができ、放送がBに伝達されると、Bは、結果オブジェクトからAが格納したデータを取得することができる.システムがメールを受け取って送信する放送は秩序ある放送である.
三、放送受信者を登録する二つの方式
①AndroidManifest.xmlに登録
プロファイルに登録されている受信者の特徴は、アプリケーションが閉じられていても、携帯電話のバッテリーの電力の放送受信者など、興味のある放送を受信することができ、プログラムを開く必要がないことです.以下の例1,2放送受信者は電話をかける放送を受信する.

  • android:label="@string/app_name">










  • /**
  • *アナログダイヤル
  • *  
  • *@author徐越
  • *  
  • */

  • publicclass MainActivity extends Activity  
  • {  

  • @Override

  • publicvoid onCreate(Bundle savedInstanceState)  
  •    {  

  • super.onCreate(savedInstanceState);  
  •        setContentView(R.layout.main);  

  •        Intent intent = new Intent();  
  •        intent.setAction("android.intent.action.CALL");  

  • this.sendBroadcast(intent);  
  •    }  

  • }  

  • /**
  • *ブロードキャストを受信するたびに新しいBroadcastReceiver 1が生成され、onReceiveメソッドの処理が完了すると
  • は使用されなくなる.
    *再受信は、新しいBroadcastReceiver 1オブジェクトを生成する.
  • *  

  • *@author徐越
  • *  

  • */
  • publicclass BroadcastReceiver1 extends android.content.BroadcastReceiver  

  • {  
  • public BroadcastReceiver1()  

  •    {  
  •        Log.i("xy_Receiver", "construtor1");  

  •    }  

  • @Override
  • publicvoid onReceive(Context context, Intent intent)  

  •    {  
  •        Log.i("xy_Receiver", "onReceive1");  

  •    }  

  • }  

  • /**
  • *放送受信者2
  • *  
  • *@author徐越
  • *  
  • */

  • publicclass BroadcastReceiver2 extends android.content.BroadcastReceiver  
  • {  

  • public BroadcastReceiver2()  
  •    {  

  •        Log.i("xy_Receiver", "construtor2");  
  •    }  

  • @Override

  • publicvoid onReceive(Context context, Intent intent)  
  •    {  

  •        Log.i("xy_Receiver", "onReceive2");  
  •    }  

  • }  

  • /**

  • *放送受信者3
  • *  

  • *@author徐越
  • *  

  • */
  • publicclass BroadcastReceiver3 extends android.content.BroadcastReceiver  

  • {  

  • public BroadcastReceiver3()  
  •    {  

  •        Log.i("xy_Receiver", "construtor3");  
  •    }  

  • @Override

  • publicvoid onReceive(Context context, Intent intent)  
  •    {  

  •        Log.i("xy_Receiver", "onReceive3");  
  •    }  

  • }

  • ②Activityに登録
    Activityにおいてバインディング受信者は、アプリケーションの存在に依存する必要があるか、またはBroadcastReceiverがUIを更新するために使用される必要があり、プログラムが閉じるときに受信者が実行する必要がないため、AndroidManifestで実行する必要はない.xmlに登録してActivityに登録できます.
    /**
  • *Activityに登録されているブロードキャスト受信者
  • *  
  • *@author徐越
  • *  
  • */

  • publicclass MainActivity extends Activity  
  • {  

  • private BroadcastReceiver receiver;  
  • privatestaticfinal String CALL_ACTION = "android.intent.action.CALL";  

  • @Override

  • publicvoid onCreate(Bundle savedInstanceState)  
  •    {  

  • super.onCreate(savedInstanceState);  
  •        setContentView(R.layout.main);  

  •    }  

  • /**
  • *アナログ送信電話のブロードキャスト
  •     *  
  •     * @param v

  •     */
  • publicvoid sendBroadCast(View v)  

  •    {  
  •        Intent intent = new Intent();  

  •        intent.setAction("android.intent.action.CALL");  
  • this.sendBroadcast(intent);  

  •    }  

  • publicvoid bindReceiver(View v)  
  •    {  

  •        receiver = new BroadcastReceiver();  
  •        IntentFilter intentFilter = new IntentFilter();  

  •        intentFilter.addAction(CALL_ACTION);  
  • this.registerReceiver(receiver, intentFilter);  

  •    }  

  • publicvoid unBindReceiver(View v)  
  •    {  

  • this.unregisterReceiver(receiver);  
  •    }  

  • }  

  • publicclass BroadcastReceiver extends android.content.BroadcastReceiver  
  • {  

  • @Override

  • publicvoid onReceive(Context context, Intent intent)  
  •    {  

  •        Log.i("xy", "receiver");  
  •    }  

  • }

  • 本文は「IT徐デブのコラム」ブログから出ていますので、ぜひこの出典を残してくださいhttp://woshixy.blog.51cto.com/5637578/1097197