1. 程式人生 > >Android 廣播接收器 BroadcastReceiver 註冊、登出、優先順序、攔截

Android 廣播接收器 BroadcastReceiver 註冊、登出、優先順序、攔截



BroadcastReceiver也就是廣播接收者的意思,顧名思義,它就是用來接收來自系統和應用中的廣播。

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

Android中的廣播機制設計的非常出色,很多事情原本需要開發者親自操作的,現在只需等待廣播告知自己就可以了,大大減少了開發的工作量和開發週期。而作為應用開發者,就需要數練掌握

Android系統提供的一個開發利器,那就是BroadcastReceiver。下面我們就對BroadcastReceiver逐一地分析和演練,瞭解和掌握它的各種功能和用法。

首先,我們來演示一下建立一個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;

}

}

}