Android學習之路-------廣播接收器,android-------
前言
沒想到離上一篇博文的時間已經有一個多星期了,時間真的不等人啊,在這裡LP告訴你們一個道理,如果現在有誰正在看行政時間的書,那麼請你們把這些書放下吧,看了也沒有用,因為時間我們根本管不了,我們只能管自己,如果真的想管時間,錯了,應該是珍惜時間的話,那麼請你們要和時間做朋友,介紹一本書給大家看《和時間做朋友》 作者是 李笑來。 不說廢話了,廣播開始了
目錄
- 什麼是廣播
- 廣播的種類
- 怎麼去使用這些廣播
- 最安全的廣播
什麼是廣播?
廣播相信有上過學的人都知道,在學校裡面都有那麼一個大喇叭,通知大家起床做早操,通知大家去上課,通知大家夠時間吃飯了等等一些,這種就是廣播,其實Android中的廣播原理就是這樣,只是性質不一樣而已。
廣播的種類
1.標準廣播
它是一種完全非同步執行的廣播,一旦發出後,所有的接收器在同一時間內接收到這個廣播,沒有任何順序可言
這種廣播效率比較高,在效率高的同時也意味著它是無法被截斷的
直接
2.有序廣播
它是一種同步執行的廣播,在廣播發出之後,同一時間內只有一個廣播接收器接收到,當這個廣播接收器的邏輯執行完了才會繼續傳播,所以這種廣播機制是有優先順序的,優先順序越高就可以最先接收到廣播,同樣的道理,優先順序高,自然也可以截斷廣播不讓廣播繼續傳下去。
直接
怎麼去使用這些廣播
要使用這些廣播那麼就必須要註冊,說到註冊廣播,Android系統提供了兩種註冊機制。
1.動態註冊
動態註冊的話,直接調用registerReceiver()方法就可以註冊了,但是在活動銷毀的時候必須要調用unregisterReceiver()方法取消註冊。
雖說動態註冊廣播接收器,可以自由的控制,在靈活性方面有很大的優勢,但是有一個缺點,就是必須要在程式啟動之後才能接收到廣播。
代碼如下:
1 public class MainActivity extends Activity { 2 private IntentFilter intentFilter; 3 private NetworkChangeReceiver networkChangeReceiver; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 intentFilter = new IntentFilter();10 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");11 networkChangeReceiver = new NetworkChangeReceiver();12 registerReceiver(networkChangeReceiver, intentFilter);13 }14 15 @Override16 protected void onDestroy() {17 super.onDestroy();18 unregisterReceiver(networkChangeReceiver);19 }20 21 class NetworkChangeReceiver extends BroadcastReceiver {22 @Override23 public void onReceive(Context context, Intent intent) {24 Toast.makeText(context, "network changes", Toast.LENGTH_SHORT)25 .show();26 }27 }28 }
2.靜態註冊
上面介紹了動態註冊廣播接收器,相信你們自然會注意到,動態註冊只能在程式啟動後才能接受廣播,那麼你們肯定會有疑問,那怎麼才能讓程式已啟動就能接受到呢?沒錯下面LP要介紹的這種方式就能解決你們的疑問,而且註冊非常簡單。下面我就寫一個開機廣播吧...
首先建立一個類,然後繼承BroadcastReceiver,代碼如下
1 public class BootCompleteReceiver extends BroadcastReceiver {2 @Override3 public void onReceive(Context context, Intent intent) {4 Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();5 }6 }
然後在項目的根目錄下的AndroidManifest.xml檔案的Application標籤下配置:
1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 package="com.example.broadcasttest" 3 android:versionCode="1" 4 android:versionName="1.0" > 5 6 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 7 8 <application 9 android:allowBackup="true"10 android:icon="@drawable/ic_launcher"11 android:label="@string/app_name"12 android:theme="@style/AppTheme" >13 <receiver android:name=".BootCompleteReceiver" >14 <intent-filter>15 <action android:name="android.intent.action.BOOT_COMPLETED" />16 </intent-filter>17 </receiver>18 </application>19 20 </manifest>
注意寫開機廣播接收器需要在資訊清單檔中添加開機許可權。
我們的邏輯業務代碼都是卸載onReceive這個方法裡面就可以了。
廣播接收介紹完了,那麼到底我們可不可以自己發廣播呢,答案是肯定的....我們又怎麼去發廣播呢?
其實發廣播非常簡單,代碼如下:
1 /** 2 * 自訂廣播接收器,接收自己發送的廣播 3 */ 4 public class MyBroadcastReceiver extends BroadcastReceiver { 5 @Override 6 public void onReceive(Context context, Intent intent) { 7 Toast.makeText(context, "received in MyBroadcastReceiver", 8 Toast.LENGTH_SHORT).show(); 9 }10 }
接收器寫好了,不過還需要在AndroidManifest.xml檔案中定義:
1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 2 package="com.example.broadcasttest" 3 android:versionCode="1" 4 android:versionName="1.0" > 5 6 <application 7 android:allowBackup="true" 8 android:icon="@drawable/ic_launcher" 9 android:label="@string/app_name"10 android:theme="@style/AppTheme" >11 <receiver android:name=".MyBroadcastReceiver" >12 <intent-filter>13 <action android:name="com.example.broadcasttest. MY_BROADCAST" />14 </intent-filter>15 </receiver>16 </application>17 18 </manifest>
好了,都準備完了,這時候我們就可以寫發送廣播的代碼了:
1 public class MainActivity extends Activity { 2 @Override 3 protected void onCreate(Bundle savedInstanceState) { 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_main); 6 Button button = (Button) findViewById(R.id.button); 7 button.setOnClickListener(new OnClickListener() { 8 @Override 9 public void onClick(View v) {10 Intent intent = new Intent(11 "com.example.broadcasttest. MY_BROADCAST");12 sendBroadcast(intent);13 }14 });15 }16 }
點擊按鈕就可以成功的發送廣播了,是不是非常簡單。。其實要注意的就是 Intent()裡的 com.example.broadcasttest. MY_BROADCAST 和 AndroidManifest.xml檔案裡定義的廣播接收器配置中intent-filter中的 <action android:name="com.example.broadcasttest. MY_BROADCAST" /> 一直就可以了
前面介紹到,有兩種廣播的,那麼我們怎麼去區分呢,其實也是很簡單的,只是在發送廣播的時候用的方法不一樣,
發送標準廣播,即不可截斷的廣播用 sendBroadcast(intent)方法
發送有序廣播,即可截斷的廣播用 sendOrderBroadcast(intent,null)方法
最安全的廣播
那麼最安全的廣播是什麼廣播呢?
那就是本地廣播,為什麼說最安全呢?因為通過這種廣播機制發出的廣播,只能夠在應用程式的內部傳遞資料,且廣播接收器也只能接受來自本應用的廣播。而前面我們介紹的廣播,都是全域廣播,反正在同一個手機,應用程式發送出去的廣播,別的程式都可以接收到,我們也可以接收到別的程式發來的廣播。這樣很容易產生安全性漏洞,所以說本地廣播是最安全的。
如何去使用呢?
通過LocalBroadcastManager的getInstance()方法得到它的一個失礼,然後調用LocalBroadcastManager的registerReceiver註冊一個廣播接收器,而在發送本地廣播的時候調用LocalBroadcastManager的sendBroadcast()方法就可以了,非常簡單...
代碼如下:
1 public class MainActivity extends Activity { 2 private IntentFilter intentFilter; 3 private LocalReceiver localReceiver; 4 private LocalBroadcastManager localBroadcastManager; 5 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main);10 localBroadcastManager = LocalBroadcastManager.getInstance(this); // 擷取執行個體11 Button button = (Button) findViewById(R.id.button);12 button.setOnClickListener(new OnClickListener() {13 @Override14 public void onClick(View v) {15 16 Intent intent = new Intent(17 "com.example.broadcasttest. LOCAL_BROADCAST");18 localBroadcastManager.sendBroadcast(intent); // 發送本地廣播19 }20 });21 intentFilter = new IntentFilter();22 intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");23 localReceiver = new LocalReceiver();24 localBroadcastManager.registerReceiver(localReceiver, intentFilter); // 註冊本地廣播監聽器25 }26 27 @Override28 protected void onDestroy() {29 super.onDestroy();30 localBroadcastManager.unregisterReceiver(localReceiver);31 }32 33 class LocalReceiver extends BroadcastReceiver {34 @Override35 public void onReceive(Context context, Intent intent) {36 Toast.makeText(context, "received local broadcast",37 Toast.LENGTH_SHORT).show();38 }39 }40 }小結
在不知不覺中,我們已經學了Android四大組件的兩個組件了,後面我還會將我學到的一一分享,寫到這裡來。
關於廣播接收器的重點都介紹完了,大家有沒有覺得很難? 或者說有沒有發現LP哪裡寫的不對,如果有的話,麻煩各位博友,動一下手指頭在下面點評一下LP。如果覺得LP寫的還不錯的話,麻煩也動下滑鼠幫我點個贊,你們的點贊是我的動力啊
其他精彩文章
android學習筆記(41)android選項菜單和子功能表(SubMenu )android學習筆記(40)Notification的功能與用法android學習筆記(42)android使用監聽器來監聽菜單事件android學習筆記(43)android建立單選菜單和複選菜單android學習筆記(44)android設定與功能表項目關聯的Activityandroid學習筆記(45)android操作功能表