2016-11-18 11 views
0

これは、BatteryStatsHelperを取得するためのリフレクションについてのコードです。私が手にリストが空であるReflectionを使用して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"

私は、このコンストラクタは、システムのコンテキストを必要とします。私はそれを得る方法を知らない。方法がわかっている場合は、お知らせください。

編集:私はリフレクションを使用せずに、いくつかのフレームワークAPIを使用するようにAndroid hidden APIを使用することができました

。しかし、私はBatteryStatsHelperやBatteryStatsImplから値を取得することができませんでした。 BatterySipperは、アプリケーションのすべてのデータを保存するオブジェクトですが、それを入力する必要があります。

私は現在、Android OSの中でsettings appを勉強しており、上記のクラスを正しく呼び出す方法を理解しています。

関連する問題