Android開發的過程中,我想要通過代碼來實現數據連接的開啟和關閉,最初我將目標鎖定為ConnectivityManager類,但是在翻閱了Android官方API後並沒有找到相關的方法,如圖1。 圖1 但是據說Android的一些類的某些方法的API是非公開的,所以我又做瞭如下嘗試:獲得Conn ...
Android開發的過程中,我想要通過代碼來實現數據連接的開啟和關閉,最初我將目標鎖定為ConnectivityManager類,但是在翻閱了Android官方API後並沒有找到相關的方法,如圖1。
圖1
但是據說Android的一些類的某些方法的API是非公開的,所以我又做瞭如下嘗試:獲得ConnectivityManager在載入時的Class對象,並查看了其中的方法;代碼如下(這是一個方法中的全部代碼):
1 ConnectivityManager connectivityManager = null;
2 Class connectivityManagerClz = null;
3 try {
4 connectivityManager = (ConnectivityManager) cxt
5 .getSystemService(Context.CONNECTIVITY_SERVICE);
6 connectivityManagerClz = connectivityManager.getClass();
7 Method[] methods = connectivityManagerClz.getMethods();
8 for(Method method : methods){
9 Log.i("Android數據連接管理",method.toGenericString());
10 }
11 Method method = connectivityManagerClz.getMethod(
12 "setMobileDataEnabled", new Class[] { boolean.class });
13 method.invoke(connectivityManager, state);
14 } catch (Exception e) {
15 e.printStackTrace();
16 }
通過代碼的第4-6行:我獲取到了ConnectivityManager的Class對象引用;
通過代碼的第7行:我獲得了ConnectivityManager類的所有方法(包括公開的和未公開的);
通過代碼的第8-10行:我將ConnectivityManager的方法的信息列印到了LogCat視窗,其中的片段如下圖,可以看到,圖中第一和第三個方法是圖1中沒有的;很明顯第一個方法是設置數據連接的,通過boolean型參數設置開啟與關閉;至此處理問題的方法找到了。由於該方法未被公開,通過實例化普通方法調用(實例化、靜態調用)行不通,所以我這兒使用java的反射機制進行調用
通過代碼的第11-12行:我獲得了第一個方法setMobileDataEnabled的Method對象,在第12行代碼中傳入setMobileDataEnabled方法所屬類的實例和他的boolean型參數,好了,到此能夠管理數據連接的方法setMobileDataEnabled已經可以被使用了