轉載請注明出處:http://www.cnblogs.com/frank-zouxu/p/4118806.html
最近在做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已經可以被使用了
