女孩:BroadcastReceiver是什麼呀? 男孩:Broadcast是廣播的意思,在Android中應用程式之間的傳輸信息的機制,BroadcastReceiver是接收廣播通知的組件,廣播和廣播接收器是Android中需要瞭解的,那麼怎麼樣去瞭解呢~ 廣播,大家應該可以理解,我們在學校做眼 ...
- 女孩:BroadcastReceiver是什麼呀?
- 男孩:Broadcast是廣播的意思,在Android中應用程式之間的傳輸信息的機制,BroadcastReceiver是接收廣播通知的組件,廣播和廣播接收器是Android中需要瞭解的,那麼怎麼樣去瞭解呢~
廣播,大家應該可以理解,我們在學校做眼保健操時,就有個廣播,告訴我們要做眼保健操了。廣播傳遞信息告訴我們要做什麼,通知信息或傳遞數據等。廣播接收器是用來接收來自系統和應用的廣播。
在Android中提供了兩種主要的類型廣播:標準廣播和有序廣播。
什麼是廣播呢?在手機的消息提示框,對話框或通知的形式告訴我們,如我們手機沒電了,會彈出提示,接收簡訊彈出提示等。而Broadcast Receiver為廣播接收器,是接收廣播的組件。
- 女孩:那麼哥,什麼是普通廣播和有序廣播?
- 男孩:額,在這裡你要瞭解一下普通廣播和有序廣播,主要講一下。~
普通廣播:
Normal broadcasts,是一種完全非同步執行的廣播,當廣播發出後,幾乎所有廣播接收器都會在同一時間收到這條廣播。如下圖:
這相當於有人在廣播室里,播放做眼保健操的信息,一同發出到每個教室一樣,沒有先後順序之分,對於普通廣播是無法終止廣播的傳播,一旦發送,無法截斷其中一條,幾乎被所有接受者收到,而我們做眼保健操的就是接受者了。對於普通廣播,在Android中使用Context.sendBroadcast()方法來發送。
有序廣播:
有序廣播,Ordered broadcasts,是一種同步執行的廣播,廣播發出後,只會有一個廣播接收器能接收到廣播消息,當這個廣播接收器接收到後,廣播才會繼承傳遞,對於有序廣播有了先後順序,在Android中提供了優先順序的屬性(priority)來控制先後,有序廣播中可以截斷廣播,不被下一個廣播接收器接收,這是有序廣播的特點。
在這裡你瞭解了普通廣播和有序廣播的原理,這兩種其實就是廣播的接收的不同表現形式而已。
BroadcastReceiver的實現:
到頭來還是要瞭解BroadcastReceiver的實現,接下來我列出主要的內容目錄,對於廣播接收器是我們要掌握的,是Android中重要的四大組件之一。
接收系統廣播
你或許會問一下什麼又是系統廣播,對於掌握手機概念的,應用懂得系統,如:電池電量低,發送系統廣播消息;安裝新應用,廣播安裝信息等。
廣播註冊分動態和靜態兩種:
動態註冊,需要繼承BroadcastReceiver的,並重寫onCreate()方法,和onReceive()方法,在onReceive()方法中,要實例接收器和IntentFilter實例。接著繼續重寫onDestroy()方法,加入unregisterReceiver()方法來實現取消註冊。
在動態註冊的廣播接收器中最後一定要取消註冊。
簡化:
重寫onCreate()
重寫onDestroy()
extends BroadcastReceiver
重寫onReceive()
靜態註冊,只要在配置文件中修改代碼即可,在AndroidManifest.xml文件中:
<receiver android:name=包名.類名>
<intent-filter>
<action android:name="發送的廣播"
</intent-filter>
</receiver>
這裡補充說一個自定義的廣播接受者
步驟:同樣
- 繼承BroadcastReceiver基類
- 覆寫抽象方法onReceive()方法
以上為發送普通廣播的實現形式,那麼你還記得一個有序廣播嗎?對於有序廣播的形式很簡單,也是和普通廣播一樣實現。只在發送有差異而已。
有序廣播和普通廣播差異:只要修改普通廣播中sendBroadcast()方法,改成sendOrderedBroadcast()方法即可,你會覺得難記嗎?
廣播接收器(Broadcast Reveiver)
標準廣播(Normal broadcasts)
有序廣播(Ordered broadcasts)
這裡說一下,我把標準廣播說錯成標準廣播了,其實這裡標準和普通隨意叫吧,不過為了顯示技術牛逼,在外人前儘量說標準廣播吧。ok?
使用本地廣播:
什麼又是本地廣播呢?你會問道,本地廣播是Android引入的一套機制,為本地廣播機制,使用本地廣播機制,有很多優點:
- 不用但系機密數據被泄漏;
- 不用擔心安全漏洞的隱患;
- 更加高效。
在介紹本地廣播之前,前面講的廣播室一種全局的,屬於系統全局廣播,廣播室一個全局的監聽器,在Android中,我們要知道廣播有兩種說法:廣播發送者和廣播接收者。
在本地廣播重點說明:本地廣播沒有靜態註冊的方式,靜態註冊是為了程式在未啟動前也能收到廣播,而發送本地廣播時,我們的程式是已開啟了的。
- 女孩:哥,講的差不多了,已經掌握了,不過可以寫一些代碼例子嗎?
- 男孩:嗯,可以,掌握就牛逼了~
代碼示例:
// 繼承BroadcastReceivre基類
public class MyBroadcastReceiver extends BroadcastReceiver {
// 覆寫onReceive()方法
@Override
public void onReceive(Context context, Intent intent) {
//寫入接收廣播後的操作
}
}
示例動態註冊:
private IntentFilter intentFilter;
private MyReceiver myReceiver;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
myReceiver = new MyReceiver();
registerReceiver(myReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
示例靜態註冊:
<receiver android:name=".包名" >
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
最後都要加許可權:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
發送自定義廣播:
Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要發送的廣播值
sendBroadcast(intent);
發送有序廣播:
//sendOrderedBroadcast()方法
Intent intent = new Intent("com.example.dashu.MY_BROADCAST");
//指明要發送的廣播值
sendOrderBroadcast(intent,null);
<intent-filter android:priority="100">
...
</intent-filter>
//優先順序
abortBroadcast();
//截斷
本地廣播:
localBroadcastManager = LocalBroadcastManager.getInstance(this);
//獲取實例
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.....");
myReceriver = new MyReceriver();
localBroadcastManager.registerReceiver(myReceriver, intentFilter);
Intent intent = new Intent("com...");
localBroadcastManager.sendBroadcast(intent);
//發送本地廣播
localBroadcastManager.unregisterReceiver(myReceiver);
總結
有關內容就到這裡了,本篇介紹了四大組件中的廣播組件的知識點。