android學習筆記之Intent與BroadcastReceiver

銳湃發表於2015-08-31

監聽安卓本地的Broadcast Intents

比如時區的改變,資料連線狀態,簡訊的接收,來電,底座模式,電池狀態等等。

下面的列表介紹的是一些裝置狀態變化的Actions:

1.ACTION_BOOT_COMPLETED 當你的安卓系統啟動完成時觸發,App要接收此廣播,需要RECEIVE_BOOT_COMPLETED許可權。

2.ACTION_CAMERA_BUTTON 當照相機的按鈕被點選。

3.ACTION_DATE_CHANGED 和 ACTION_TIME_CHANGED  日期或者時間被手動改變時會傳送此廣播。

4.ACTION_MEDIA_EJECT 外儲存裝置被物理得拔出的時候觸發,通常指的是SD卡

5.ACTION_MEDIA_MOUNTED和ACTION_MEDIA_UNMOUNTED 前者是外部儲存(SD卡或U盤)被成功被載入,後者是成功被移除(注意這個跟物理拔出不一樣)。

注意:監聽SD卡狀態時候,除了ACTION必須以外,你的過濾器還需要data scheme為file.(比如intentFilter.addDataScheme("file"),很重要,不然收不到廣播)

6.ACTION_NEW_OUTGOING_CALL  監聽電話打出的廣播,那麼我可以看到號碼麼?答:可以,首先一定是存在發來的intent中,那麼intent只要找到這個儲存的鍵,就可以找到值,這個鍵是什麼呢?答:EXTRA_PHONE_NUMER。 注意:需要許可權PROCESS_OUTGOING_CALLS

7.ACTION_SCREEN_ON和ACTION_SCREEN_OFF 分別監聽的是螢幕開啟和關閉。

8.ACTION_TIMEZONE_CHANGED 當前手機時區發生改變,Intent包含了time-zone鍵,返回的是Java.util.TimeZone的ID

 

監聽電池狀態改變

之前我們討論過這個電池狀態的廣播Intent是屬於Sticky Intent,所以通常不需要去宣告一個接受者去接收。

Aciton是什麼呢? 答:Intent.ACTION_BATTERY_CHANGED

例子:

IntentFilter batIntentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 
Intent battery = context.registerReceiver(null, batIntentFilter); 
int status = battery.getIntExtra(BatteryManager.EXTRA_STATUS, -1); 
boolean isCharging = 
  status == BatteryManager.BATTERY_STATUS_CHARGING || 
  status == BatteryManager.BATTERY_STATUS_FULL;

這個intent裡面包含了當前電量的電量狀態,還有是否是充電狀態。

值得注意一點:你不能在mainfest中去註冊一個Receiver來監聽電池變化這個ACTION。但是呢,你還是可以監視電源的連線情況,低電池水平,和接下來的列出的:

1.ACTION_BATTERY_LOW 電池電量低

2.ACTION_BATTERY_OKAY 電池電量水平OK

3.ACTION_POWER_CONNECTED  與電源連線

4.ACTION_POWER_DISCONNECTED 與電源斷開

 

監聽連線的改變(比如藍芽,NFC,網路,wi-fi)

那麼這裡所指的連線改變具體是什麼呢?

答:包括頻寬,延遲,可用的網路連線和一些對APP有用的資訊發生改變。

應用場景舉例:比如當你斷開了wifi,你可能需要掛起app正在更新的東西,直到你又連上了。

註冊這種廣播,動態靜態都可以,具體連線的資訊,你還需要用到Connectivity Manager。

Aciton: mainfest中:android.net.conn.CONNECTIVITY_CHANGE,程式中:ConnectivityManager.CONNECTIVITY_ACTION

例子:

String svcName = Context.CONNECTIVITY_SERVICE; 
ConnectivityManager cm = (ConnectivityManager)context.getSystemService(svcName);
 
NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
boolean isConnected = activeNetwork.isConnectedOrConnecting(); 
boolean isMobile = activeNetwork.getType() == 
                        ConnectivityManager.TYPE_MOBILE;

關於Connectivity Manager更多的資訊,還有NFC,WI-FI等下次再討論。

 

監聽底座狀態改變

安卓裝置可以放在車的底座或者辦工桌的手機底座上。

廢話不多說了,Action:    Intent.ACTION_DOCK_EVENT(android.intent.action.ACTION_DOCK_EVENT) ,你可以得到底座狀態和底座型別。

像電池狀態的監聽,這個廣播intent,也是sticky的。

例子:

IntentFilter dockIntentFilter = 
   new IntentFilter(Intent.ACTION_DOCK_EVENT); 
Intent dock = registerReceiver(null, dockIntentFilter);
 
int dockState = dock.getIntExtra(Intent.EXTRA_DOCK_STATE, 
                       Intent.EXTRA_DOCK_STATE_UNDOCKED); 
boolean isDocked = dockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;

執行時管理Mainfest中宣告的Receivers.

通過使用Package Manager, 你可以啟用或者禁用接受者,通過方法setComponentEnabledSetting(還包括activity,service)。

這樣的話,當你需要監聽的時候,就可以禁用這個廣播。(爽吧)

下面給出程式碼片段:

ComponentName myReceiverName = new ComponentName(this, MyReceiver.class);
PackageManager pm = getPackageManager();
 
// Enable a manifest receiver
pm.setComponentEnabledSetting(myReceiverName, 
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
PackageManager.DONT_KILL_APP);
 
// Disable a manifest receiver
pm.setComponentEnabledSetting(myReceiverName, 
PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
PackageManager.DONT_KILL_APP);


轉自:http://my.oschina.net/wangjunhe/blog/101913

相關文章