BroadcastReceiver理解爲廣播接收者,它用於接收程序所發出的Broadcast的Intent。它在一端監聽接收廣播消息,然後再做出處理。它的本質上就是屬於一個監聽器。啓動BroadcastRecevicer的方式有兩種:sendBroadcast()和sendOrderedBroadcast(),兩者的區別就是前者是發送一個普通的廣播,後者是發送一個有序的廣播。
開發廣播接收才的步驟:
1、 繼承BroadcastReceiver類,重寫onReceiver(Context context,Intent intent)方法
2、 在AndroidMainfest.xml中註冊,同樣也可以在代碼中實現註冊
3、 通過sendBroadcast()或sendOrderedBroadcast()啓動對應的BroadcastReceiver
下面分別介紹:
實現廣播消息處理機制的方式
繼承BroadcastReceiver,覆蓋onReceive
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
System.out.println("--myReceiver constructor--");
}
public void onReceive(Context context, Intent intent) {
System.out.println("--onReceive--");
//取到信息
String receiveMsg = intent.getStringExtra("msg");
Toast.makeText(context, receiveMsg, Toast.LENGTH_LONG).show();
}
}
註冊BroadcastReceiver的兩種方式:
方式一:AndroidMainfest.xml中註冊:
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.jiahui.activity.MY_ACTION" />
</intent-filter>
</receiver>
方式二:應用程序代碼中註冊
myReceiver2 = new MyReceiver2();
IntentFilter intentFilter = new IntentFilter();
Intent intent=new Intent();
intentFilter.addAction(SMS_ACTION);
registerReceiver(myReceiver2, intentFilter);
兩種註冊方式的區別:
1)第一種是常駐型,也就是說當應用程序關閉後,如果有信息廣播來,程序也會被系統調用自動運行。
2)第二種不是常駐型廣播,也就是說廣播跟隨程序的生命週期。
廣播的類型:
廣播被分爲兩種不同的類型:“普通廣播(Normal broadcasts)”和“有序廣播(Ordered broadcasts)”。普通廣播是完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,但缺點是:接收者不能將處理結果傳遞給下一個接收者,並且無法終止廣播Intent的傳播;然而有序廣播是按照接收者聲明的優先級別(聲明在intent-filter元素的android:priority屬性中,數越大優先級別越高,取值範圍:-1000到1000。也可以調用IntentFilter對象的setPriority()進行設置),被接收者依次接收廣播。如:A的級別高於B,B的級別高於C,那麼,廣播先傳給A,再傳給B,最後傳給C。A得到廣播後,可以往廣播裏存入數據,當廣播傳給B時,B可以從廣播中得到A存入的數據。
Context.sendBroadcast()
發送的是普通廣播,所有訂閱者都有機會獲得並進行處理。
Context.sendOrderedBroadcast()
發送的是有序廣播,系統會根據接收者聲明的優先級別按順序逐個執行接收者,前面的接收者有權終止廣播(BroadcastReceiver.abortBroadcast()),如果廣播被前面的接收者終止,後面的接收者就再也無法獲取到廣播。對於有序廣播,前面的接收者可以將處理結果存放進廣播Intent,然後傳給下一個接收者。
再總結說說兩種廣播的區別比較:
普通廣播:異步,數據不共享,傳遞效率高
有序廣播:同步,數據可以達到共享,傳遞效率低
說了這麼一大堆,是不是都暈,那就上實例吧
實例1:發送普通廣播
1、 寫一個繼承於BroadcastReceiver的類,並重寫onReceiver方法
package com.jiahui.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(
context,
"接收到的Intent的Action爲" + intent.getAction() + "\n傳遞的消息內容爲"
+ intent.getStringExtra("msg"), Toast.LENGTH_LONG)
.show();
}
}
2、 在AndroidMainfest.xml中註冊
<receiver android:name=".MyBroadcastReceiver" >
<intent-filter >
<action android:name="com.jiahui.broadcast.mybroadcast" />
</intent-filter>
</receiver>
3、 在Activity中發送廣播
package com.jiahui.broadcast;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class BroadcastDemo1Activity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnSend = (Button) this.findViewById(R.id.btnSend);
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
// 指定發送特定的BroadcastReceiver
intent.setAction("com.jiahui.broadcast.mybroadcast");
// 帶一些消息內容過去
intent.putExtra("msg", "我發過來的數據哦");
sendBroadcast(intent);
}
});
}
}
實現效果:
實例2:發送有序廣播
寫兩個BroadcastReceiver類
MyReceiver01.java:
package com.jiahui.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class MyReceiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("---MyReceiver1----onReceive---");
String receiverMsg = intent.getStringExtra("msg");
System.out.println("receiverMsg:" + receiverMsg);
Toast.makeText(
context,
"接收到的Intnet的action" + intent.getAction() + "\n發過來的消息內容:"
+ receiverMsg, 5000).show();
Bundle bundle = new Bundle();
bundle.putString("first", "第一個廣播接收者給的數據");
// 放入下一個結果中,讓下一個廣播接收者收到消息
setResultExtras(bundle);
}
}
MyReceiver02.java
package com.jiahui.broadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("---MyReceiver2----onReceive---");
// 取到結果
Bundle bundle = getResultExtras(true);
String receiverMsg = bundle.getString("first");
System.out.println("receiverMsg:" + receiverMsg);
Toast.makeText(
context,
"接收到的Intnet的action" + intent.getAction() + "\n發過來的消息內容:"
+ receiverMsg, 5000).show();
}
}
在Androidmainfest.xml中文件註冊,同時設置爲優先級
<receiver android:name=".MyReceiver1" >
<intent-filter android:priority="20" >
<!-- 設置廣播接收者的優先級 -->
<action android:name="com.jiahui.broadcast.myreceiver" />
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver2" >
<intent-filter android:priority="10" >
<!-- 設置廣播接收者的優先級 -->
<action android:name="com.jiahui.broadcast.myreceiver" />
</intent-filter>
</receiver>
注意:這裏兩個廣播接收者設置的action是一樣
開發Activity在Activity中發送有序廣播消息
package com.jiahui.broadcast;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class BroadcastDemo2Activity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnSend = (Button) this.findViewById(R.id.btnSend);
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.jiahui.broadcast.myreceiver");
intent.putExtra("msg", "發給第一個接收者的數據");
// 發送有序廣播
sendOrderedBroadcast(intent, null);
}
});
}
}
實現效果:
當一段時間我們就可以看到又會彈出一個信息如下圖:
也可以通過控制檯監視:
開發BroadcastReceiver的一些注意事項:
BroadcastReceiver的生命週期比較短,一些比較費時的操作不應該放在onReceiver裏完成。如果在onReceiver()的方法不能在10秒內執行完成,將會產生程序無響應也就是我們熟悉的ANR(Application not Response)。但是如果非得要在這裏面執行一些費時的操作我們可以在這個onReceiver去啓動一個Service來完成這樣的一個費時操作。
如需轉載引用請註明出處:http://blog.csdn.net/jiahui524