私のアプリでは、複数のをホーム画面に配置することができ、各ウィジェットは定期的にリモートデータを取得します。複数のAppウィジェットのデータ使用量を別々にトラッキングする
私の目標は、次のとおりです。唯一の私自身のアプリ(他のアプリのデータ使用量に興味を持っていない)の
- 複数のウィジェットのそれぞれに関連付けられたトラックデータの利用、別途
- 無線LANとモバイルデータ利用
- 特別な許可なし
- ウィジェットは、データ使用量の二重計算なしでネットワーク操作を同時に実行できるようにします。
- は、アプリ内のウィジェット
- レポート結果(ときだけでなくネットワークトラフィックツールにつなが)
から開始WebView
活動中のデータ使用量を含めることは、ウィジェットの前と後に、独自のUIDのためのデータ使用量をログに記録するのは簡単ですgetUidRxBytes()
とgetUidTxBytes()
を使用して(自分のアプリのUIDを渡して)TrafficStats
で更新し、その差を利用してください。このラフ・アンド・レディー・アプローチは、ウィジェットが連続して実行されているときに合理的な価値を提供しますが、同時に実行されている場合は必然的に二重(三重など)のカウントが行われます。
私はむしろデバイスのスケジューリングエンジンに最適なものを見つけ出すためにウィジェットを強制的に更新する必要はありません。だから私は、それぞれのウィジェットのデータ使用を互いに分離する方法が必要です。
タグの使用は、appWidgetId
でネットワーク操作にタグを付けてから、appWidgetId
に基づいて統計情報をフィルタリングする方法と思われます。私はこのアプローチを確信していませんは実際には1つのウィジェットのデータ使用を別のウィジェットと区別することができます(バケツは混乱するかもしれません)。しかし、実際にはタグ付けをすることができませんまだ教えてください。
ネットワーク操作が開始される前に、setThreadStatsTag(tag)
でタグを設定できますが、TrafficStats
クラスではタグでフィルタリングされた結果を取得するメソッドが表示されません。 誰も知っていますか?
次に、私はNetworkStatsManager、特にNetworkStatsManager.queryDetailsForUidTag(... , tag)
を見ました。これは特定のtag
に基づいてフィルタリングすることを可能にしており、あなたのアプリケーションのUIDのための特別な許可なしでうまく動作します。しかし、HttpURLConnection
を使用してネットワーク操作を行う前にTrafficStats.setThreadStatsTag(appWidgetId)
を設定し、後でNetworkStatsManager.queryDetailsForUidTag(... , appWidgetId)
を呼び出して同じタグを使用してクエリを実行しても、データを含むバケットを返す方法はありません。一方
、NetworkStatsManager.queryDetailsForUid()
(なしtag
パラメータ)はそれだけで動作していないタグではなく、根本的なもののようですので、私はNetworkStatsManager
あたりで間違ってやっている、有効なデータを持つリターンバケットを行いますse。
私はタグを設定します。
(WiFiのデータ用)@Override
protected void onPreExecute() {
TrafficStats.setThreadStatsTag(appWidgetId);
}
@Override
protected Bitmap doInBackground(String... baseUrls) {
// fetch data with HttpURLConnection
}
@Override
protected void onPostExecute(Bitmap bmp) {
TrafficStats.clearThreadStatsTag();
}
そして、私は統計を照会:私が間違って
void networkStatsStuff() {
NetworkStats networkStats;
NetworkStats networkStatsTagged;
int networkType = ConnectivityManager.TYPE_WIFI;
try {
networkStats = networkStatsManager.queryDetailsForUid(networkType, "", startTime, endTime, myUid);
} catch (RemoteException e) {
return;
}
networkStatsTagged = networkStatsManager.queryDetailsForUidTag(networkType, "", startTime, endTime, myUid, appWidgetId);
long totalData = getTotalData(networkStats);
long totalDataTagged = getTotalData(networkStatsTagged);
Log.d(TAG, "totalData: " + totalData); // this seems to work
Log.d(TAG, "totalDataTagged: " + totalDataTagged); // this is always zero
}
long getTotalData(NetworkStats networkStats) {
long totalData = 0;
do {
NetworkStats.Bucket bucket = new NetworkStats.Bucket();
networkStats.getNextBucket(bucket);
totalData = totalData + bucket.getRxBytes() + bucket.getTxBytes();
} while (networkStats.hasNextBucket());
return totalData;
}
何をしているのですか? (編集:部分的な答えは以下です。)または私の目的を達成するために全く異なる方法がありますか?