2017-08-12 4 views
13

私のアプリでは、複数のをホーム画面に配置することができ、各ウィジェットは定期的にリモートデータを取得します。複数の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; 
} 

何をしているのですか? (編集:部分的な答えは以下です。)または私の目的を達成するために全く異なる方法がありますか?

答えて

1

部分的な答え:

だから私は、私は私がpreExecute()AsyncTaskのそれぞれpostExecute()で、setThreadStatsTag()clearThreadStatsTag()の配置を得たところである、this guideによって惑わされたと思います。

AsyncTaskdoInBackground()にタグの設定と解除を移動すると、タグが表示され始めます... Androidデバイスモニターでこれが最初に気付きましたが、 tagでフィルタリングするNetworkStatsメソッド。

だから、のようなものを使用することがより正しいと思われるの線に沿って、in this guideを説明:

@Override 
protected Bitmap doInBackground(String... baseUrls) { 
    TrafficStats.setThreadStatsTag(appWidgetId); 
    try { 
     // fetch data with HttpURLConnection 
    } finally { 
     TrafficStats.clearThreadStatsTag(); 
    } 
} 

だから、単純に間違っ最初のガイダンスがありますか?

まだ未解決:任意の追加の権限せずにモバイルデータ利用を照会

  • (私はREAD_PHONE_STATE許可が必要であることを恐れて...やり過ぎのように思える、と迷惑な許可がTrafficStatsを必要とされていないことを考慮すると、
  • のデータ使用量はWebViewを超えています(これは可能ではない、つまりWebViewのトラフィックにタグを付けることができないため、区別できません関係するプロトコルの性質のためにだけで... thisおよびthisが該当するかもしれない)
関連する問題