Android開發教學
Android 開發環境配置
Android 架構
Android 應用組件
Android Hello World示例
Android 資源組織和訪問
Android Activity
Android Service
Android廣播接收器
Android內容提供者
Android碎片/片段
Android Intent過濾器
Android UI佈局
Android LinearLayout
Android RelativeLayout
Android TableLayout
Android AbsoluteLayout
Android FrameLayout
Android ListView
Android GridView
Android UI控件
Android TextView
Android EditText
Android AutoCompleteTextView
Android Button
Android ImageButton
Android CheckBox
Android ToggleButton
Android RadioButton
Android RadioGroup
Android事件處理
Android樣式和主題
Android樣式示例
Android主題示例
Android自定義組件
Android拖放
Android通知
Android基於位置服務
Android發送電子郵件
Android發送短信/SMS
Android撥打電話
發佈Android應用
ArrayAdapter
SimpleCursorAdapter
Android ProgressDialog
Android Spinner
使用活動代碼自定義Android組件
使用佈局文件自定義Android組件
Android自定義組件及屬性
Android Alertdialog(警告對話框)
Android Animation(動畫)實例
Android音頻捕獲(錄音)
Android音頻管理器實例
Android AutoCompleteTextView(自動完成)實例
Android最佳實踐
Android Bluetooth(藍牙)實例
Android Camera(攝像頭)
Android Clipboard(複製/剪貼板)
Android自定義字體
Android數據備份
Android Gestures/手勢
Android圖片效果
Android圖片切換
Android內部存儲
Android JetPlayer實例
Android JSON解析器
Android加載Spinner
Android本地化
Android登錄實例
Android MediaPlayer(多媒體播放)

Android廣播接收器

廣播接收器(Broadcast)簡單地從其他應用程序或系統響應廣播消息。這些消息有時稱爲事件或意圖。例如,應用程序也可以發起廣播,以讓其他應用程序知道某些數據已經被下載到設備上,可供它們使用。廣播接收器會攔截此通信,並會採取適當操作(動作)。

以下兩個重要的步驟,在使用廣播接收器工作系統及廣播意圖:

  • 創建廣播接收器

  • 註冊廣播接收器

還有一個附加的步驟,要實現自定義的意圖,那麼將必須創建並廣播意圖。

創建廣播接收器

實現廣播接收機BroadcastReceiver類的一個子類並重寫 onReceive()方法,其中每個收到消息作爲一個 Intent 對象參數。

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

註冊廣播接收器

應用程序偵聽特定的廣播意圖是通過在 AndroidManifest.xml 文件中註冊一個廣播接收器。寄存器 MyReceiver 系統生成事件 ACTION_BOOT_COMPLETED,在Android系統完成了啓動過程後,這是由系統啓動執行的。

<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name="MyReceiver"> <action android:name="android.intent.action.BOOT_COMPLETED">

當 Android 設備啓動,它會被截獲 BroadcastReceiverMyReceiverand 內實現邏輯,首先 onReceive() 將被執行。

有幾個系統產生的事件定義在最後意圖類的靜態字段。下表列出了一些重要的系統事件。

事件常量

描述

android.intent.action.BATTERY_CHANGED

持久廣播含充電狀態,級別,以及其他相關的電池信息。

android.intent.action.BATTERY_LOW

顯示設備的電池電量低。

android.intent.action.BATTERY_OKAY

指示電池正在低點後但沒有問題。

android.intent.action.BOOT_COMPLETED

一次播出後,系統已完成啓動。

android.intent.action.BUG_REPORT

顯示活動報告的錯誤。

android.intent.action.CALL

執行呼叫由數據指定某人。

android.intent.action.CALL_BUTTON

用戶按下「呼叫」按鈕進入撥號器或其他適當的用戶界面發出呼叫。

android.intent.action.DATE_CHANGED

日期改變。

android.intent.action.REBOOT

有設備重啓。

廣播定製意圖

如果希望應用程序本身生成併發送自定義意圖,那麼必須使用sendBroadcast()方法裏面活動類來創建和發送這些的意圖。使用(意向)sendStickyBroadcast() 方法意圖是粘粘的,這意味着所發送的意圖保持周廣圍播出後完成。

public void broadcastIntent(View view) { Intent intent = new Intent(); intent.setAction("com.yiibai.CUSTOM_INTENT"); sendBroadcast(intent); }

意圖 com.yiibai.CUSTOM_INTENT也可以以註冊類似的方式,因爲我們產生註冊系統的意圖。

<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name="MyReceiver"> <action android:name="com.yiibai.CUSTOM_INTENT">

示例

這個例子將解釋如何創建BroadcastReceiver 攔截自定義意圖。熟悉自定義意圖後,就可以編寫應用程序來攔截系統生成的意圖。現在按照下面的步驟來修改前面創建的Hello World範例中 Android 應用程序:

步驟

描述

1

使用Eclipse IDE創建Android應用程序,並將其命名爲HelloWorld在包com.example.helloworld下,類似Hello World示例章節中一樣。

2

修改主要活動文件MainActivity.java添加broadcastIntent()方法。

3

在包com.example.helloworld下創建一個新的Java文件 MyReceiver.java,並定義一個BroadcastReceiver。

4

應用程序可以處理一個或多個自定義和系統的意圖不受任何限制。要攔截每一個意圖,必須使用 <receiver.../>標籤並註冊在AndroidManifest.xml文件中。

5

修改 res/layout/activity_main.xml 文件的默認內容包括:一個按鈕廣播意圖。

6

定義常量 broadcast_inte 在 ntres/values/strings.xml文件中

7

運行該應用程序啓動Android模擬器並驗證應用程序所做的修改結果。

以下是修改主要活動文件 src/com.example.helloworld/MainActivity.java 後的內容。這個文件包括每個生命週期方法。這裏添加了 broadcastIntent() 方法來廣播自定義的意圖。

package com.example.helloworld; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.content.Intent; import android.view.View; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } // broadcast a custom intent. public void broadcastIntent(View view) { Intent intent = new Intent(); intent.setAction("com.yiibai.CUSTOM_INTENT"); sendBroadcast(intent); } }

下面是 src/com.example.helloworld/MyReceiver.java 的內容:

package com.example.helloworld; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); } }

下面將 AndroidManifest.xml 文件的內容修改。在這裏添加 <service.../>標籤,包括服務:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.helloworld" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER"/> <receiver android:name="MyReceiver"> <action android:name="com.yiibai.CUSTOM_INTENT">

以下將 res/layout/activity_main.xml 文件的內容包括一個按鈕來廣播自定義意圖:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/btnStartService" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/broadcast_intent" android:onClick="broadcastIntent"/>

下面將在 res/values/strings.xml 中定義兩個新的常量的內容: 

<string name="app_name">HelloWorld <string name="hello_world">Hello world! <string name="menu_settings">Settings <string name="title_activity_main">MainActivity <string name="broadcast_intent">Broadcast Intent

現在運行修改後的 Hello World!應用程序。假設創建了AVD並設置了環境。要從Eclipse運行的應用程序,首先打開一個項目的活動文件,從工具欄單擊「run」  Eclipse  圖標。 Eclipse AVD安裝的應用程序,並啓動它,如果設置和應用都沒有問題,將會顯示以下模擬器窗口:

Android

現在廣播自定義的意圖,點擊上廣播意圖按鈕,這將廣播自定義在 「com.yiibai.CUSTOM_INTENT」  註冊BroadcastReceiver 的意圖將被 MyReceiver攔截。 實現的邏輯如下出現底部的模擬器:

Android

可以嘗試執行其他 BroadcastReceiver 攔截系統的意圖,如系統啓動,更改日期,電池電量不足等。