標籤:android style http io color ar 使用 sp java
BroadcastReceiver(廣播接收器)是Android中的四大組件之中的一個。
以下是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。
以下我通過代碼示範自己定義廣播事件和系統廣播事件的使用。完整代碼:android_broadcastreceiver.rar
Step1:在MainActivity的onStart方法中注冊廣播事件。靜態注冊方式是在AndroidManifest.xml檔案裡。
Step2: 點擊對應button後會觸發對應的方式來發送廣播訊息。
/** * 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;@Overridepublic 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{@Overridepublic 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", "正在充電。。。。");}}}@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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廣播呢?有知道的同學請告訴我一下,再此先謝過。
執行介面:
Android中Broadcast Receiver組件具體解釋