BroadcastReceiver(廣播接收器)是Android中的四大組件之一。下面就具體介紹一下Broadcast Receiver組件的用法。
下面是Android Doc中關於BroadcastReceiver的概述:
①廣播接收器是一個專註於接收廣播通知資訊,並做出對應處理的組件。很多廣播是源自於系統代碼的──比如,通知時區改變、電池電量低、拍攝了一張照片或者使用者改變了語言選項。應用程式也可以進行廣播──比如說,通知其它應用程式一些資料下載完成並處於可用狀態。
②應用程式可以擁有任意數量的廣播接收器以對所有它感興趣的通知資訊予以響應。所有的接收器均繼承自BroadcastReceiver基類。
③廣播接收器沒有使用者介面。然而,它們可以啟動一個activity來響應它們收到的資訊,或者用NotificationManager來通知使用者。通知可以用很多種方式來吸引使用者的注意力──閃動背燈、震動、播放聲音等等。一般來說是在狀態列上放一個持久的表徵圖,使用者可以開啟它並擷取訊息。
Android中的廣播事件有兩種,一種就是系統廣播事件,比如:ACTION_BOOT_COMPLETED(系統啟動完成後觸發),ACTION_TIME_CHANGED(系統時間改變時觸發),ACTION_BATTERY_LOW(電量低時觸發)等等。另外一種是我們自訂的廣播事件。
廣播事件的流程
①註冊廣播事件:註冊方式有兩種,一種是靜態註冊,就是在AndroidManifest.xml檔案中定義,註冊的廣播接收器必須要繼承BroadcastReceiver;另一種是動態註冊,是在程式中使用Context.registerReceiver註冊,註冊的廣播接收器相當於一個匿名類。兩種方式都需要IntentFIlter。
②發送廣播事件:通過Context.sendBroadcast來發送,由Intent來傳遞註冊時用到的Action。
③接收廣播事件:當發送的廣播被接收器監聽到後,會調用它的onReceive()方法,並將包含訊息的Intent對象傳給它。onReceive中代碼的執行時間不要超過5s,否則Android會彈出逾時dialog。
下面我通過代碼示範自訂廣播事件和系統廣播事件的使用。
Step1:在MainActivity的onStart方法中註冊廣播事件。靜態註冊方式是在AndroidManifest.xml檔案中。
Step2: 點擊相應按鈕後會觸發相應的方式來發送廣播訊息。
/** * MainActivity * @author zuolongsnail * */ public class MainActivity extends Activity { private Button sendStaticBtn; private Button sendDynamicBtn; private Button sendSystemBtn; private static final String STATICACTION = "com.byread.static"; private static final String DYNAMICACTION = "com.byread.dynamic"; // USB裝置串連 private static final String SYSTEMACTION = Intent.ACTION_POWER_CONNECTED; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sendStaticBtn = (Button) findViewById(R.id.send_static); sendDynamicBtn = (Button) findViewById(R.id.send_dynamic); sendSystemBtn = (Button) findViewById(R.id.send_system); sendStaticBtn.setOnClickListener(new MyOnClickListener()); sendDynamicBtn.setOnClickListener(new MyOnClickListener()); sendSystemBtn.setOnClickListener(new MyOnClickListener()); } class MyOnClickListener implements OnClickListener{ @Override public void onClick(View v) { // 發送自訂靜態註冊廣播訊息 if(v.getId() == R.id.send_static){ Log.e("MainActivity", "發送自訂靜態註冊廣播訊息"); Intent intent = new Intent(); intent.setAction(STATICACTION); intent.putExtra("msg", "接收靜態註冊廣播成功!"); sendBroadcast(intent); } // 發送自訂動態註冊廣播訊息 else if(v.getId() == R.id.send_dynamic){ Log.e("MainActivity", "發送自訂動態註冊廣播訊息"); Intent intent = new Intent(); intent.setAction(DYNAMICACTION); intent.putExtra("msg", "接收動態註冊廣播成功!"); sendBroadcast(intent); } // 發送系統動態註冊廣播訊息。當手機串連充電裝置時會由系統自己發送廣播訊息。 else if(v.getId() == R.id.send_system){ Log.e("MainActivity", "發送系統動態註冊廣播訊息"); Intent intent = new Intent(); intent.setAction(SYSTEMACTION); intent.putExtra("msg", "正在充電。。。。"); } } } @Override protected void onStart() { super.onStart(); Log.e("MainActivity", "註冊廣播事件"); // 註冊自訂動態廣播訊息 IntentFilter filter_dynamic = new IntentFilter(); filter_dynamic.addAction(DYNAMICACTION); registerReceiver(dynamicReceiver, filter_dynamic); // 註冊系統動態廣播訊息 IntentFilter filter_system = new IntentFilter(); filter_system.addAction(SYSTEMACTION); registerReceiver(systemReceiver, filter_system); } private BroadcastReceiver dynamicReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.e("MainActivity", "接收自訂動態註冊廣播訊息"); if(intent.getAction().equals(DYNAMICACTION)){ String msg = intent.getStringExtra("msg"); Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } } }; private BroadcastReceiver systemReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Log.e("MainActivity", "接收系統動態註冊廣播訊息"); if(intent.getAction().equals(SYSTEMACTION)){ String msg = intent.getStringExtra("msg"); Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } } }; }
Step3:接收廣播訊息。以下為兩個靜態註冊的廣播接收器。
/** * 自訂靜態註冊廣播訊息接收器 * @author zuolongsnail * */ public class StaticReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String msg = intent.getStringExtra("msg"); Toast.makeText(context, msg, Toast.LENGTH_SHORT).show(); } }
/** * 系統靜態註冊廣播訊息接收器 * * @author zuolongsnail * */ public class SystemReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_BATTERY_LOW)) { Log.e("SystemReceiver", "電量低提示"); Toast.makeText(context, "您的手機電量偏低,請及時充電", Toast.LENGTH_SHORT).show(); } } }
下面是AndroidManifest.xml檔案:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.byread" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 註冊自訂靜態廣播接收器 --> <receiver android:name=".StaticReceiver"> <intent-filter> <action android:name="com.byread.static" /> </intent-filter> </receiver> <!-- 註冊系統靜態廣播接收器 --> <receiver android:name=".SystemReceiver"> <intent-filter> <action android:name="android.intent.action.BATTERY_LOW" /> </intent-filter> </receiver> </application> </manifest>
介面布局檔案main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/send_static" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="發送自訂靜態註冊廣播" /> <Button android:id="@+id/send_dynamic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="發送自訂動態註冊廣播" /> <Button android:id="@+id/send_system" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="發送系統動態註冊廣播" /> </LinearLayout>
講解結束,不過有一點我自己也沒弄清楚,這個系統廣播事件如果我在程式中sendBroadcast的話,那就是自訂廣播了。如果不寫的話,那是不是系統自己來發送對應Action廣播呢?有知道的同學請告訴我一下,再此先謝過。
運行介面:
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。