一:什麼是BroadcastReceiver Broadcast(廣播)是一種廣泛運用於在應用程式之間一步傳播消息的機制系統消息Android系統發出的,電池不足、來電信息等自定義消息第三方應用發出的廣播消息 廣播消息本質上就是一個Intent對象Intent是一對一的通信,廣播消息是一對多的通信 ...
一:什麼是BroadcastReceiver
Broadcast(廣播)是一種廣泛運用於在應用程式之間一步傳播消息的機制
系統消息
Android系統發出的,電池不足、來電信息等
自定義消息
第三方應用發出的廣播消息
廣播消息本質上就是一個Intent對象
Intent是一對一的通信,廣播消息是一對多的通信
BroadcastReceiver用於接受並處理廣播消息
BroadcastReceiver沒有用戶界面
藉助其他方式和用戶交互,例如,啟動Activity、使用Notification等
二.廣播消息的處理流程
1.廣播消息的處理分為三個環節:1.消息發送 2.BroadcastReceiver註冊 3.消息處理
2.系統廣播都被定義為android.content.Intent中的Action常量
3.利用BroadcastReceiver實現onReceive方法 。捕獲系統廣播ACTION_BOOT_COMPLETED可以輕鬆實現開機後程式自動運行
4.在AndroidManifest.xml文件中增加應用許可權聲明
<uses-permission android:name="com.mybroadcast.permission"/>
廣播消息發送方式有多種
無序廣播:sentBroadcast(),效率高,但是消息處理器之間沒有關聯
有序廣播:sendOrderedBroadcast(),可以傳遞處理數據
持續廣播:sendStickyBroadcast()發送的廣播一直存在
三.發送一個普通廣播
1.發送一個普通廣播
//發送一個普通廣播(1:發廣播,2:註冊一個接收者,3:處理廣播) public void send_broadcast(View iew){ Intent intent=new Intent(); intent.setAction("com.gdnf.broadcast_1");//自定義一個廣播地址 intent.putExtra("message","2018年1月1號放假一天"); //開始廣播 sendBroadcast(intent,"com.mybroadcast.permission"); }
2.靜態註冊一個接收者
1 <!--靜態註冊一個廣播接收者--> 2 <receiver 3 android:permission="com.mybroadcast.permission" 4 android:name="com.example.broadcast_receiver.Broadcast_Receiver_1"> 5 <!--過濾接收什麼樣的廣播--> 6 <intent-filter> 7 <action android:name="com.gdnf.broadcast_1"/> 8 </intent-filter> 9 </receiver>
3.定義一個廣播接收者
/** * 定義了一個廣播接收者 */ public class Broadcast_Receiver_1 extends BroadcastReceiver{ //對接收到的廣播進行處理 @Override public void onReceive(Context context, Intent intent) { Log.i("Broadcast_Receiver_1","Broadcast_Receiver_1接收到廣播"); String message=intent.getStringExtra("message"); Log.i("Broadcast_Receiver_1","Broadcast_Receiver_1收到消息:"+message); } }
四.發送一個有序廣播
1.
//發送有序廣播 public void send_order_broadcast(View view){ Intent intent=new Intent("com.gdnf.broadcast_order");
sendOrderedBroadcast(intent,null,null,null,0,"發放1萬過年補貼",null);
}
2.註冊接收者,並且聲明接收者收到廣播的先後順序
priority降序排列,值最大的,最先收到廣播。依次類推
<receiver android:name="com.example.broadcast_receiver.OrderBroadcast_1"> <intent-filter android:priority="10"> <action android:name="com.gdnf.broadcast_order"/> </intent-filter> </receiver> <receiver android:name="com.example.broadcast_receiver.OrderBroadcast_2"> <intent-filter android:priority="9"> <action android:name="com.gdnf.broadcast_order"/> </intent-filter> </receiver> <receiver android:name="com.example.broadcast_receiver.OrderBroadcast_3"> <intent-filter android:priority="8"> <action android:name="com.gdnf.broadcast_order"/> </intent-filter> </receiver>
3.以上面為例 priority="10"最先收到廣播可以對廣播內容進行修改後再把廣播發送出去
public class OrderBroadcast_1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String message=intent.getStringExtra("message"); String date=getResultData();//獲取數據 Log.i("OrderBroadcast_1","OrderBroadcast_1第一個收到廣播"+message); Log.i("OrderBroadcast_1","通知內容是:"+date); setResultData("發放3000過年補貼"); } }
priority="9"接收到的內容已經改變,依次類推。