安卓學習之廣播

來源:互聯網
上載者:User

標籤:

1.廣播機制

  標準廣播:

    標準廣播(Normal broadcasts)是一種完全非同步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎都會在同一時刻接收到這條廣播訊息,因此它們之間沒有任何先後順序可言,它是無法被截斷的。工作流程圖:

  有序廣播:

    有序廣播(Ordered broadcasts)則是一種同步執行的廣播,在廣播發出之後,同一時刻只會有一個廣播接收器能夠收到這條廣播訊息,當這個廣播接收器中的邏輯執行完畢後,廣播才會繼續傳遞。所以此時的廣播接收器是有先後順序的,優先順序高的廣播接收器就可以先收到廣播訊息,並且前面的廣播接收器還可以截斷正在傳遞的廣播,這樣後面的廣播接收器就無法收到廣播訊息了。工作流程圖:

2.接受系統廣播:

  註冊廣播的方式一般有兩種,在代碼中註冊和在 AndroidManifest.xml 中註冊,其中前者也被稱為動態註冊,後者也被稱為靜態註冊。

  動態註冊:

    建立項目,修改 MainActivity 中的代碼:

public class MainActivity extends Activity {  private IntentFilter intentFilter;  private NetworkChangeReceiver networkChangeReceiver;  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    intentFilter = new IntentFilter();    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");    networkChangeReceiver = new NetworkChangeReceiver();    registerReceiver(networkChangeReceiver, intentFilter);  }  @Override  protected void onDestroy() {    super.onDestroy();    unregisterReceiver(networkChangeReceiver);  }  class NetworkChangeReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {    Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show();    }  }}

  我們在MainActivity定義了一個內部類 NetworkChangeReceiver,繼承自 BroadcastReceiver。重寫了父類的 onReceive()方法,每當網路發生變換,onReceive()方法得到執行。

  然後觀察 onCreate()方法,首先我們建立了一個 IntentFilter 的執行個體,並給它添加了一個值為 android.net.conn.CONNECTIVITY_CHANGE的action,當網路狀態發生變化時, 系統發 出的正是一條值為android.net.conn.CONNECTIVITY_CHANGE 的廣播,也就是說我們的廣播接收器想要監聽什麼廣播,就在這裡添加相應的action就行了。然後調用registerReceiver()

方法進行註冊。這樣NetworkChangeReceiver 就會收到所有值為 android.net.conn.CONNECTIVITY_CHANGE 的廣播,也就實現了監聽網路變化的功能。

  動態註冊的廣播接收器一定都要取消註冊才行,這裡我們是在 onDestroy()方法中通過調用 unregisterReceiver()方法來實現的。

  靜態註冊:

  動態註冊的廣播接收器可以自由地控制註冊與登出,在靈活性方面有很大的優勢,但是它也存在著一個缺點,即必須要在程式啟動之後才能接收到廣播,靜態註冊就可以避免這種跟情況。

  建立一個類BootCompleteReceiver 繼承自BroadcastReceiver

public class BootCompleteReceiver extends BroadcastReceiver {  @Override  public void onReceive(Context context, Intent intent) {    Toast.makeText(context, "Boot Complete", Toast.LENGTH_LONG).show();  }}

 

  修改 AndroidManifest.xml 檔案

<manifest xmlns:android="http://schemas.android.com/apk/res/android"  package="com.example.broadcasttest"  android:versionCode="1"  android:versionName="1.0" >......  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  <application      android:allowBackup="true"      android:icon="@drawable/ic_launcher"      android:label="@string/app_name"      android:theme="@style/AppTheme" >......     <receiver android:name=".BootCompleteReceiver" >      <intent-filter>        <action android:name="android.intent.action.BOOT_COMPLETED" />      </intent-filter>    </receiver>  </application></manifest>

  <application>標籤內出現了一個新的標籤<receiver>,所有靜態註冊的廣播接收器都是在這裡進行註冊的。它的用法其實和<activity>標籤非常相似,首先通過 android:name來指定具體註冊哪一個廣播接收器,然後在<intent-filter>標籤裡加入想要接收的廣播就行了,由於 Android 系統啟動完成後會發出一條值為 android.intent.action.BOOT_COMPLETED 的廣播,因此我們在這裡添加了相應的 action。

  另外,監聽系統開機廣播也是需要聲明許可權的,可以看到,我們使用<uses-permission>標籤又加入了一條 android.permission.RECEIVE_BOOT_COMPLETED 許可權。

  這樣就能做開機接收廣播了。

 

  未完~

 

安卓學習之廣播

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.