2016-11-18 68 views
0

這是關於使用反射來獲取BatteryStatsHelper的代碼。使用反射來獲取BatteryStatsHelper.getUsageList()

try { 
     batteryStatsHelperClass = Class.forName("com.android.internal.os.BatteryStatsHelper"); 
     Constructor constructor = batteryStatsHelperClass.getConstructor(Context.class); 

     Method getUsageList = batteryStatsHelperClass.getDeclaredMethod("getUsageList"); 
     getUsageList.setAccessible(true); 

     List list = (List) getUsageList.invoke(batteryStatsHelper); 
     Log.d(TAG, "size: " + list.size()); 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } catch (PackageManager.NameNotFoundException e) { 
     e.printStackTrace(); 
    } 

列表中我得到的是空的,我想知道這種方式是真實的,爲什麼我不能得到的數據?

這是BatteryStatshelper的源代碼。

public BatteryStatsHelper(Context context) { 
    this(context, true); 
} 

public BatteryStatsHelper(Context context, boolean collectBatteryBroadcast) { 
    this(context, collectBatteryBroadcast, checkWifiOnly(context)); 
} 

public BatteryStatsHelper(Context context, boolean collectBatteryBroadcast, boolean wifiOnly) { 
    mContext = context; 
    mCollectBatteryBroadcast = collectBatteryBroadcast; 
    mWifiOnly = wifiOnly; 
} 

.................. 

public List<BatterySipper> getUsageList() { 
    return mUsageList; 
} 

回答

0

您必須首先初始化對象的實例,像(你是不是調用Constructor):

BatteryStatsHelper helper = new BatteryStatsHelper(context, true); 
helper.create(savedInstanceState); 
0

正確地調用這個類,你需要通過聲明來創建一個新的實例構造函數並使用它。

Object o = Class.forName("com.android.internal.os.BatteryStatsHelper") 
       .getConstructor(Context.class, boolean.class, boolean.class) 
       .newInstance(getContext(), true, true); 

但是,當我試圖使用一些方法,我只得到虛擬值。

double foo = (Double) Class.forName("com.android.internal.os.BatteryStatsHelper") 
       .getMethod("getComputedPower") // get method 
       .invoke(o); // use it 

輸出: 「1.0」

我想這個構造函數需要一個系統環境。我不知道如何得到它。如果您知道如何,請告訴我們。

編輯:

我能夠使用Android hidden API使用一些框架的API,而無需使用反射。但我無法從BatteryStatsHelper或BatteryStatsImpl中檢索任何值。 BatterySipper是保存應用程序的所有數據的對象,但您需要填寫它。

我正在學習Android操作系統內部的settings app以瞭解如何正確調用上面提到的所有類。