4

どのアプリが最も多くのデータトラフィックを消費しているかをユーザーに示すことができるように、さまざまなアプリケーションのトラフィック使用量を測定するバックグラウンドサービスを作成しようとしています。

スペアパーツアプリはまさにそれを実行することがわかりましたが、1.6 Dell Streakデバイスにインストールした後、「ネットワーク使用量」の「バッテリー使用量データがありません」が常に表示されます。この機能はスペアパーツでまったく機能しますか?また、スペアパーツの実用的なソースコードが見つかりませんでした。

https://android.googlesource.com/platform/development/+/froyo-release/apps/SpareParts
は古くなっているか、不完全なようです。(?)

ただし、スペアパーツはアプリごとのCPU使用率などを測定しているようです。ルート化されていない電話でそれをどのように行うのですか?

アプリあたりのトラフィックを測定する方法についての私の一般的な考え方は、定期的にチェックすることです。

"sys/class/net/" + sWiFiInterface + "/statistics/rx_bytes"

"sys/class/net/" + sWiFiInterface + "/statistics/tx_bytes"

"sys/class/net/" + sMobileInterface + "/statistics/rx_bytes"

"sys/class/net/" + sMobileInterface + "/statistics/tx_bytes"

ファイルを作成し、現在フォーカスがあり、生成されたネットワークトラフィックを引き起こす可能性が最も高いアプリを確認します。

残念ながら、現在フォーカスを持っているアプリを取得する方法が見つかりません。

私はこれを見つけました:

Android、現在表示されているアクティビティに関する情報を取得するにはどうすればよいですか?

しかし、ルート化されていないAndroidデバイスで実行されているサードパーティサービスだけでなく、テストに関するもののようです。

実行中のアクティビティを取得できますが、どのアクティビティにもActivityManager.getCurrentTasks()焦点を当てることができます。セキュリティ上の懸念から、Androidアーキテクトは、サードパーティのアプリにどのアプリがフォーカスされているかを明示的に知らせたくないようです。

http://android.bigresource.com/Track/android-zb2mhvZX4/を参照してください)。

これを回避する方法はありますか?

また、どのアクティビティがトラフィックを消費するかだけでなく、どのサービスも検出したい場合は、現在実行中のすべてのサービスを取得し ActivityManager.getCurrentSerives() 、フォアグラウンドモードであるかどうかを確認することもできます(Androidがリソースを必要とする場合にスローされるのとは異なります)。しかし、これも私を遠ざけることはありません。

何か案は?

4

1 に答える 1

3

現在フォアグラウンドのアプリケーションをActivityManager.getRunningAppProcesses呼び出しで検出できます。RunningAppProcessInfoレコードのリストを返します。どのアプリケーションがフォアグラウンドにあるかを判別するには、RunningAppProcessInfo.importanceフィールドがに等しいかどうかをチェックしRunningAppProcessInfo.IMPORTANCE_FOREGROUNDます。

ただし、メソッドの呼び出しActivityManager.getRunningAppProcesses()はUIスレッドではなく実行する必要があることに注意してください。バックグラウンドスレッドで(たとえばAsyncTaskを介して)呼び出すだけで、正しい結果が返されます。詳細については、私の投稿を確認してください。

于 2011-03-16T22:26:22.993 に答える