Android開發之BroadcastReceiver

來源:互聯網
上載者:User

標籤:

BroadcastReceiver:廣播接收者。用來接收系統或應用中的廣播。

在Android系統中,廣播體現在方方面面,例如當開機完成後系統會產生一條廣播,接收到這條廣播就能實現開機啟動服務的功能;當網路狀態改變時系統會產生一條廣播,接收到這條廣播就能及時地做出提示和儲存資料等操作;當電池電量改變時,系統會產生一條廣播,接收到這條廣播就能在電量低時告知使用者及時儲存進度,等等。

Android中的廣播機制設計的非常出色,很多事情原本需要開發人員親自操作的,現在只需等待廣播告知自己就可以了,大大減少了開發的工作量和開發週期。而作為應用開發人員,就需要數練掌握Android系統提供的一個開發利器,那就是BroadcastReceiver。下面我們就對BroadcastReceiver逐一地分析和演練,瞭解和掌握它的各種功能和用法。

靜態註冊:

1 <receiver android:name=".MyReceiver">2             <intent-filter>3                 <action android:name="android.intent.action.MY_BROADCAST" />4                 <category android:name="android.intent.category.DEFAULT" />5             </intent-filter>6         </receiver>

廣播接收者:

 1 package com.example.hxdn.broadcastreceivertest; 2  3 import android.content.BroadcastReceiver; 4 import android.content.Context; 5 import android.content.Intent; 6 import android.util.Log; 7  8 /** 9  * Created by hxdn on 2015/9/17.10  */11 public class MyReceiver extends BroadcastReceiver {12     private static  final String TAG="MyReceiver";13     @Override14     public void onReceive(Context context,Intent intent)15     {16         String msg=intent.getStringExtra("msg");17         Log.i(TAG,msg);18     }19 }

Activity:

 1 package com.example.hxdn.broadcastreceivertest; 2  3 import android.content.Intent; 4 import android.content.IntentFilter; 5 import android.support.v7.app.AppCompatActivity; 6 import android.os.Bundle; 7 import android.view.Menu; 8 import android.view.MenuItem; 9 import android.view.View;10 import android.widget.Button;11 12 public class MainActivity extends AppCompatActivity {13 14 15     MyReceiver myReceiver=null;16     IntentFilter intentFilter=null;17     private Button btn1=null;18     @Override19     protected void onCreate(Bundle savedInstanceState) {20         super.onCreate(savedInstanceState);21         setContentView(R.layout.activity_main);22         init();//動態註冊時加入23         btn1=(Button)findViewById(R.id.btn1);24         btn1.setOnClickListener(new View.OnClickListener() {25             @Override26             public void onClick(View v) {27                 send();28             }29         });30 31     }32     public  void  init()33     {34 35         myReceiver=new MyReceiver();36         intentFilter=new IntentFilter();37         intentFilter.addAction("android.intent.action.MY_BROADCAST");38         registerReceiver(myReceiver,intentFilter);39     }40 41     @Override42     public boolean onCreateOptionsMenu(Menu menu) {43         // Inflate the menu; this adds items to the action bar if it is present.44         getMenuInflater().inflate(R.menu.menu_main, menu);45         return true;46     }47 48     @Override49     public boolean onOptionsItemSelected(MenuItem item) {50         // Handle action bar item clicks here. The action bar will51         // automatically handle clicks on the Home/Up button, so long52         // as you specify a parent activity in AndroidManifest.xml.53         int id = item.getItemId();54 55         //noinspection SimplifiableIfStatement56         if (id == R.id.action_settings) {57             return true;58         }59 60         return super.onOptionsItemSelected(item);61     }62     public  void send()63     {64         Intent intent=new Intent("android.intent.action.MY_BROADCAST");65         intent.putExtra("msg","Hello Receiver");66         sendBroadcast(intent);67     }68     @Override69     public void onDestroy()70     {71         super.onDestroy();72         unregisterReceiver(myReceiver);73     }74 }

動態註冊:

 public  void  init()33     {34 35         myReceiver=new MyReceiver();36         intentFilter=new IntentFilter();37         intentFilter.addAction("android.intent.action.MY_BROADCAST");38         registerReceiver(myReceiver,intentFilter);39     }
需要解除綁定:
 public void onDestroy()70     {71         super.onDestroy();72         unregisterReceiver(myReceiver);73     }
否則會拋出異常。
普通廣播:普通廣播對於多個接收者來說是完全非同步,通常每個接收者都無需等待即可以接收到廣播,接收者相互之間不會有影響。對於這種廣播,接收者無法終止廣播,即無法阻止其他接收者的接收動作。且再次點擊發送按鈕,我們會發現,控制台中三個接收者仍然都列印了自己的日誌,表明接收者並不能終止廣播。abortBroadcast(); //不可用。


有序廣播:有序廣播比較特殊,它每次只發送到優先順序較高的接收者那裡,然後由優先順序高的接受者再傳播到優先順序低的接收者那裡,優先順序高的接收者有能力終止這個廣播。

在AndroidManifest.xml的廣播註冊時加上<intent-filter android:priority="1000"> 
  1. <receiver android:name=".FirstReceiver">  
  2.     <intent-filter android:priority="1000">  
  3.         <action android:name="android.intent.action.MY_BROADCAST"/>  
  4.         <category android:name="android.intent.category.DEFAULT" />  
  5.     </intent-filter>  
  6. </receiver>  
android:priority的值從-1000到1000值越大許可權越大。

  1. public void send(View view) {  
  2.     Intent intent = new Intent("android.intent.action.MY_BROADCAST");  
  3.     intent.putExtra("msg", "hello receiver.");  
  4.     sendOrderedBroadcast(intent, "scott.permission.MY_BROADCAST_PERMISSION");  //第二參數不為null則需要許可權
  5. }  


使用sendOrderedBroadcast方法發送有序廣播時,需要一個許可權參數,如果為null則表示不要求接收者聲明指定的許可權,如果不為null,則表示接收者若要接收此廣播,需聲明指定許可權。這樣做是從安全形度考慮的,例如系統的簡訊就是有序廣播的形式,一個應用可能是具有攔截垃圾簡訊的功能,當簡訊到來時它可以先接受到簡訊廣播,必要時終止廣播傳遞,這樣的軟體就必須聲明接收簡訊的許可權。

設定許可權則發出的廣播只有當你有許可權時才能收到。

android:priority值越大則代表這個接受者優先順序越高。優先順序越高可先處理廣播。

優先順序高的廣播可用abortBroadcast();終止這個廣播。


Android開發之BroadcastReceiver

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.