什麼是BroadCastReceiver
BroadcastReceiver 中文意思是“廣播接收者”,它主要是用於接收應用程序或是系統發送過來的廣播並根據廣播內容進行相關響應的一類組件。Broadcast在Android系統中應用的非常廣泛,比如電池狀態的變化、電話的接收、短信的接收、鍵盤輸入法切換和網絡連接狀態變化都會由系統發送一個廣播,然後應用程序通過BroadCastReceiver可以監聽這些廣播並作出相應的處理。此外,BroadCastReceiver可以通過監聽其它應用程序發送的廣播接收傳遞過來的信息進而實現進程間的通信,我們再查看一下BroadcastReceiver的源碼可以看到IBinder影子,就不難理解其中的原理了(Android進程通信是用IBinder實現的)。BroadCastReceiver的靜態註冊和動態註冊
要實現一個BroadcastReceiver,就必須和使用Android其它組件一樣(Activity、Service和ContentProvider),得在AndroidManifest.xml中進行註冊。下面舉一個示例,在AndroidManifest.xml中註冊BroadcastReceiver,代碼如下:
- <receiver android:name=".broadcastreceiver.NormalBroadReceiver" >
- <intent-filter >
- <action android:name="com.fendou.NORMAL_BROADCASTRECEIVER" />
- </intent-filter>
- </receiver>
- //註冊BroadcastReceiver方法
- public void filter()
- {
- IntentFilter mFilter = new IntentFilter();
- mFilter.addAction("com.fendou.NORMAL_BROADCASTRECEIVER" );
- registerReceiver( mBroadcastReceiver, mFilter);
- }
- //實例化BroadcastReceiver
- BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- if(intent.getAction().equals("com.fendou.NORMAL_BROADCASTRECEIVER" ))
- {
- //dosomething
- }
- }
- };
BroadCast的分類
<1>普通廣播
<2>有序廣播
- <!-- android:priority屬性是爲每個BroadcastReceiver設置優先級,值越大優先級越大 -->
- <receiver android:name=".broadcastreceiver.OrderBroadCastReceiverFirst" >
- <intent-filter android:priority="500" >
- <action android:name="com.fendou.ORDER_NORMALBROADCASTRECEIVER" />
- </intent-filter>
- </receiver>
- <receiver android:name=".broadcastreceiver.OrderBroadCastReceiverSecond" >
- <intent-filter android:priority="400" >
- <action android:name="com.fendou.ORDER_NORMALBROADCASTRECEIVER" />
- </intent-filter>
- </receiver>
- <receiver android:name=".broadcastreceiver.OrderBroadCastReceiverThird" >
- <intent-filter android:priority="300" >
- <action android:name="com.fendou.ORDER_NORMALBROADCASTRECEIVER" />
- </intent-filter>
- </receiver>
- public class OrderBroadCastReceiverFirst extends BroadcastReceiver {
- private static final String TAG = "ygh";
- @Override
- public void onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- if(intent.getAction().equals(StaticContens.ORDER_NORMAL_BROADCASTRECEIVER))
- {
- String info = intent.getStringExtra("info" );
- Log. i(TAG, "OrderBroadCastReceiverFirst "+ info);
- info += " First;";
- Log. i(TAG, "OrderBroadCastReceiverFirst "+ info);
- //設置結果數據
- setResultData(info);
- }
- }
- }
- public class OrderBroadCastReceiverSecond extends BroadcastReceiver {
- private static final String TAG = "ygh";
- @Override
- public void onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- if(intent.getAction().equals(StaticContens.ORDER_NORMAL_BROADCASTRECEIVER))
- {
- //得到從OrderBroadCastReceiverFirst設置的結果值
- String info = getResultData();
- info += "Second";
- Log. i(TAG, "OrderBroadCastReceiverSecond " + info);
- //設置結果數據
- setResultData(info);
- }
- }
- }
- public class OrderBroadCastReceiverThird extends BroadcastReceiver {
- private static final String TAG = "ygh";
- @Override
- public void onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- if(intent.getAction().equals(StaticContens.ORDER_NORMAL_BROADCASTRECEIVER))
- {
- //得到從OrderBroadCastReceiverFirst設置的結果值
- String info = getResultData();
- info += "; Third";
- Log. i(TAG, "OrderBroadCastReceiverThird "+ info);
- //show一個Notification
- StaticContens. showNotification(context,"新廣播", "您接收了一條新廣播" );
- }
- }
- }
- //發送一個普通廣播
- public void sendBroadcastReceiverMethod()
- {
- //實例化一個Intent對象
- Intent mIntent = new Intent();
- //mIntent.setAction(StaticContens.NORMAL_BROADCASTRECEIVER);
- mIntent.setAction(StaticContens.ORDER_NORMAL_BROADCASTRECEIVER);
- mIntent.putExtra( "info", "Hello" );
- //發送普通廣播
- this.sendBroadcast(mIntent);
- }
- //發送一個有序廣播
- public void sendOrderBroadcastReceiverMethod()
- {
- //實例化一個Intent對象
- Intent mIntent = new Intent();
- mIntent.setAction(StaticContens.ORDER_NORMAL_BROADCASTRECEIVER);
- mIntent.putExtra( "info", "Hello" );
- //發送有序廣播
- this.sendOrderedBroadcast(mIntent, "com.fendou.order_broadcastreceiver_permission" );
- }
<3>普通粘性廣播
- package com.fendou.activity;
- import com.fendou.R;
- import com.fendou.utils.StaticContens;
- import android.app.Activity;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.content.IntentFilter;
- import android.os.Bundle;
- import android.util.Log;
- import android.widget.TextView;
- public class ReceiveActivity extends Activity {
- //聲明控件對象
- private TextView mTextView;
- private static final String TAG = "ygh";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout. receive);
- //根據ID得到代表該控件的對象
- mTextView = (TextView)findViewById(R.id.show_action_textview );
- }
- @Override
- protected void onResume() {
- // TODO Auto-generated method stub
- super.onResume();
- //實例化過濾器對象
- IntentFilter mFilter = new IntentFilter();
- //添加Action
- mFilter.addAction(StaticContens. SEND_USE_NORMAL_RECEIVER);
- mFilter.addAction(StaticContens. SEND_USE_STICKY_RECEIVER);
- //註冊廣播
- registerReceiver( mBroadcastReceiver, mFilter);
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- super.onDestroy();
- //解除註冊
- unregisterReceiver( mBroadcastReceiver);
- }
- //實例化BroadcastReceiver對象
- BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- //獲取發送過來的Action
- String action = intent.getAction();
- Log. i(TAG, "The Receive Action is: "+ action);
- mTextView.setText("The Receive Action is: "+ action);
- }
- };
- }
- //發送粘性廣播
- public void sendUseStickyBroadcastReceiverMethod()
- {
- //實例化Intent對象
- Intent mIntent = new Intent();
- //設置Action
- mIntent.setAction(StaticContens.SEND_USE_STICKY_RECEIVER);
- //發送廣播
- this.sendStickyBroadcast(mIntent);
- }
- //發送普通廣播
- public void sendUseNormalBroadcastReceiverMethod()
- {
- //實例化Intent對象
- Intent mIntent = new Intent();
- //設置Action
- mIntent.setAction(StaticContens.SEND_USE_NORMAL_RECEIVER);
- //發送廣播
- this.sendBroadcast(mIntent);
- }
- //開啓ReceiveActivity
- public void startReceiveActivity()
- {
- //實例化Intent對象
- Intent mIntent = new Intent();
- mIntent.setClass(getApplicationContext(), ReceiveActivity.class );
- //開啓Activity
- this.startActivity(mIntent);
- }
- <!-- 使用BroadcastReceiver Sticky權限 -->
- <uses-permission android:name="android.permission.BROADCAST_STICKY" />
<4>有序粘性廣播
1、ACTION_TIME_CHANGED:系統時間被改變。
2、ACTION_DATE_CHANGED:系統日期被改變。
3、ACTION_TIMEZONE_CHANGED:系統時區被改變。
4、ACTION_BOOT_COMPLETED:系統啓動完成。
5、ACTION_PACKAGE_ADDED:系統中添加安裝包。
6、ACTION_PACKAGE_CHANGED:系統的包被改變了。
7、ACTION_PACKAGE_REMOVED:系統的包被刪除了。
9、ACTION_PACKAGE_DATA_CLEARED:系統的包數據被清空。
10、ACTION_BATTERY_CHANGED:電池電量改變。
11、ACTION_SHUTDOWN:系統被關閉。
<1>網絡連接的狀態改變
- <receiver android:name=".broadcastreceiver.NetworkConnectBroadCastReceiver" >
- <intent-filter >
- <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
- </intent-filter>
- </receiver>
- <!-- 讀取網絡狀態 權限-->
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- package com.fendou.broadcastreceiver;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.net.ConnectivityManager;
- import android.net.NetworkInfo;
- import android.net.NetworkInfo.State;
- import android.util.Log;
- import android.widget.Toast;
- public class NetworkConnectBroadCastReceiver extends BroadcastReceiver {
- private static final String TAG = "ygh";
- @Override
- public void onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- //Log.i(TAG, "NetworkConnectBroadCastReceiver");
- doSomething(context);
- }
- public void doSomething(Context mContext)
- {
- if(isNetworkConnect(mContext))
- {
- Toast. makeText(mContext, "網絡連接成功!!", Toast.LENGTH_LONG).show();
- Log. i(TAG, "網絡連接成功!!" );
- }
- else
- {
- Toast. makeText(mContext, "網絡已斷開連接!!", Toast.LENGTH_LONG).show();
- Log. i(TAG, "網絡已斷開連接!!" );
- }
- }
- //判斷網絡是否連接
- public boolean isNetworkConnect(Context mContext)
- {
- boolean flag = false;
- //獲取網絡連接管理對象
- ConnectivityManager manager = (ConnectivityManager) mContext.getSystemService(mContext.CONNECTIVITY_SERVICE);
- //得到所有網絡連接的信息
- NetworkInfo[] mInfo = manager.getAllNetworkInfo();
- if(mInfo != null){
- for(int i = 0 ; i < mInfo.length;i++)
- {
- //一一判斷是否有已經連接的網絡
- State mState = mInfo[i].getState();
- if(mState == NetworkInfo.State.CONNECTED )
- {
- flag = true;
- return flag;
- }
- }
- }
- return flag;
- }
- }
<2>飛行模式狀態改變
- <receiver android:name=".broadcastreceiver.AirPlaneModeChangeBroadCastReceiver" >
- <intent-filter >
- <action android:name="android.intent.action.AIRPLANE_MODE" />
- </intent-filter>
- </receiver>
- package com.fendou.broadcastreceiver;
- import com.fendou.utils.StaticContens;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- public class AirPlaneModeChangeBroadCastReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- StaticContens. showNotification(context, "通知","飛行模式狀態改變了!!" );
- }
- }