Android之路-------傳說中的大喇叭(廣播接收器),android-------

來源:互聯網
上載者:User

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寫的還不錯的話,麻煩也動下滑鼠幫我點個贊,你們的點贊是我的動力啊

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.