田海立
2012-03-16
有些時候,需要偵聽手機的ServiceState,本文從應用開發的角度,給出偵聽Android系統手機ServiceState的方法:偵聽廣播TelephonyIntents.ACTION_SERVICE_STATE_CHANGED;在TelephonyManager中註冊ListenerPhoneStateListener。
一、通過偵聽廣播
Android內部定義了ServiceState變化時,系統發出的廣播(Action:TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)。所以,如果要接收ServiceState的通知,可以通過代碼註冊
IntentFilter intentFilter = newIntentFilter(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED);// registerReceiver()是ContextWrapper定義的方法,子類中實現registerReceiver(receiver, intentFilter);
receiver是BroadcastReceiver,在其onReceive(Contextcontext, Intent intent)中,就可以偵聽到ServiceState的變化:
onReceive(Context context, Intent intent) {String action = intent.getAction();if(action.equals(TelephonyIntents.ACTION_SERVICE_STATE_CHANGED)) { ServiceState ss = ServiceState.newFromBundle(intent.getExtras()) switch(ss.getState()) { case ServiceState.STATE_IN_SERVICE: //handle for … break; case … break;} else if () { //other broadcasts…}}
在不用的時候,記得取消註冊。而要接收這個廣播,需要READ_PHONE_STATE的permission。
不過注意:這樣的偵聽方式,只能針對能看到底層的開發人員,對於純應用開發人員來說是不行的。因為,TelephonyIntents是在com.android.intenal.telephony中定義的,而這個包是隱藏的。
二、註冊Listener
既然com.android.intenal.telephony是隱藏的,給Android內部實現用的,那看外部exported的介面有什麼。有一個android.telephony的包,裡面有TelephonyManager。
通過TelephonyManager可以註冊Listener來偵聽ServiceState的變化。
TelephonyManager並不能直接被執行個體化,要擷取它的執行個體,需要通過Context.getSystemService(),註冊Listener通過listen(),其中的events是PhoneStateListener.LISTEN_xxx的bitmask:
TelephonyManager telMgr =(TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);telMgr.listen(mPhoneStateListener,PhoneStateListener.LISTEN_SERVICE_STATE);
在mPhoneStateListener這個PhoneStateListener中overrideonServiceStateChanged(ServiceState serviceState)方法就可以了。