Android 廣播接收器 BroadcastReceiver 註冊、登出、優先順序、攔截
BroadcastReceiver也就是“廣播接收者”的意思,顧名思義,它就是用來接收來自系統和應用中的廣播。
在Android系統中,廣播體現在方方面面,例如當開機完成後系統會產生一條廣播,接收到這條廣播就能實現開機啟動服務的功能;當網路狀態改變時系統會產生一條廣播,接收到這條廣播就能及時地做出提示和儲存資料等操作;當電池電量改變時,系統會產生一條廣播,接收到這條廣播就能在電量低時告知使用者及時儲存進度,等等。
Android中的廣播機制設計的非常出色,很多事情原本需要開發者親自操作的,現在只需等待廣播告知自己就可以了,大大減少了開發的工作量和開發週期。而作為應用開發者,就需要數練掌握
首先,我們來演示一下建立一個BroadcastReceiver,並讓這個BroadcastReceiver能夠根據我們的需要來執行。
要建立自己的BroadcastReceiver物件,我們需要繼承android.content.BroadcastReceiver,並實現其onReceive方法。下面我們就建立一個名為MyReceiver廣播接收者:
BroadcastReceiver逐一地分析和演練,瞭解和掌握它的各種功能和用法。
首先,我們來演示一下建立一個BroadcastReceiver,並讓這個BroadcastReceiver能夠根據我們的需要來執行。
要建立自己的BroadcastReceiver物件,我們需要繼承android.content.BroadcastReceiver,並實現其onReceive方法。
建立一個新工程LearnBroadcastReceiver,一個空Activity
廣播接收器MyReceiver
用於顯示Intent呼叫
MyReceiver1
隱式Intent
攔截廣播
MyReceiver2
隱式Intent
實現主動註冊也登出,攔截廣播
建立一個MyReceiver, MyReceiver1, MyReceiver2廣播接收類擴充套件至
public class MyReceiver extends BroadcastReceiver { public MyReceiver() { } @Override public void onReceive(Context context, Intent intent) { System.out.println("第0個廣播接收器接收到訊息是:====="+intent.getStringExtra("data")); } }
public class MyReceiver1 extends BroadcastReceiver { public MyReceiver1() { } @Override public void onReceive(Context context, Intent intent) { System.out.println("第1個廣播接收器接收到訊息是:"+intent.getStringExtra("data")); if (intent.getStringExtra("isLanJie").equals("TRUE")) { abortBroadcast();//攔截廣播,不讓優先級別低的接收該到訊息} } }
public class MyReceiver2 extends BroadcastReceiver { public static final String ACTION="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2"; public MyReceiver2() { } @Override public void onReceive(Context context, Intent intent) { System.out.println("第2個廣播接收器接收到訊息是:" + intent.getStringExtra("data")); if (intent.getStringExtra("isLanJie").equals("TRUE")){ abortBroadcast();//攔截廣播,不讓優先級別低的接收該到訊息} } }
修改androidManifest.xml中廣播接收器
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true" > </receiver> <!--<receiver android:name=".MyReceiver2" >--> <!--<intent-filter>--> <!--<action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" />--> <!--</intent-filter>--> <!--</receiver>--> <receiver android:name=".MyReceiver1" android:enabled="true" android:exported="true" > <intent-filter android:priority="1"> <action android:name="com.czg.com.learnbroadcastreceiver.intent.action.MyReceiver2" /> </intent-filter> </receiver>
在建立完我們的MyReceiver2之後,還不能夠使它進入工作狀態,我們需要為它註冊一個指定的廣播地址。沒有註冊廣播地址的BroadcastReceiver就像一個缺少選臺按鈕的收音機,雖然功能俱備,但也無法收到電臺的訊號。
public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button bSend; privateMyReceiver2 myReceiver2=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bSend=(Button) findViewById(R.id.btnSendMsg); bSend.setOnClickListener(this); findViewById(R.id.btnReg).setOnClickListener(this); findViewById(R.id.btnUnReg).setOnClickListener(this); findViewById(R.id.btnsendYinShi).setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.btnSendMsg: //傳送訊息Intent intent=new Intent(this,MyReceiver.class); intent.putExtra("data", "訊息來自czg"); sendBroadcast(intent); break; case R.id.btnsendYinShi: //沒有自動註冊的廣播接收器自能用隱式的Intent進行建立(沒有告訴要傳送給哪個接收器,所有的接收器都可以接受到,優先順序比較高的接收器可以根據需要攔截後面接收的的接收) Intent intent2=new Intent(MyReceiver2.ACTION); intent2.putExtra("data","訊息來自czg"); CheckBox cb= (CheckBox) findViewById(R.id.checkBox); if (cb.isChecked()==true){ intent2.putExtra("isLanJie","TRUE"); }else { intent2.putExtra("isLanJie","FALSE"); } //sendBroadcast(intent2); sendOrderedBroadcast(intent2, null); //傳送可以被攔截的廣播,第二個引數可以指定許可權break; case R.id.btnReg://註冊if (myReceiver2==null){ myReceiver2=new MyReceiver2(); registerReceiver(myReceiver2,new IntentFilter(MyReceiver2.ACTION)); } break; case R.id.btnUnReg://登出if (myReceiver2!=null){ unregisterReceiver(myReceiver2); myReceiver2=null; } break; } } }