Androidのタスク情報を取得する(ActivityManager)
ActivityManagerを利用することで、システムメモリの使用状況、Activityやタスクの状態がわかります。今回はその中から、以下の3つのシステム情報について取得方法を紹介します
- メモリ使用量の取得
- エラーが発生したタスク情報
- 実行中のタスク情報
それぞれ、以下のAPIを利用できます。
- void ActivityManager.getMemoryInfo(ActivityManager.MemoryInfo outInfo)
- List<ActivityManager.ProcessErrorStateInfo> ActivityManager.getProcessesInErrorState()
- List<ActivityManager.RunningAppProcessInfo>ActivityManager.getRunningAppProcesses()
メモリ使用量を取得する
ActivityManager.MemoryInfo
現在の利用可能なメモリを取得します。メモリが少なくなってきた際、積極的にプロセスを殺すLowMemoryKillerが実行されるしきい値などもMemoryInfoで取得できます。
| メンバ | 説明 |
|---|---|
| availMem | システムの使用可能メモリ合計 |
| lowMemory | 現在のlowmemoryフラグ(trueでメモリ不足状態) |
| threshold | しきい値。下回った際に、バックグラウンドサービスや、その他無関係なプロセスからKillし始める |
サンプルコードです。ActivityManagerを利用することで簡単に取得できます。
1 2 3 4 5 6 7 8 9 | ActivityManager activityManager = ((ActivityManager) getSystemService(ACTIVITY_SERVICE));//メモリ情報の取得ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();activityManager.getMemoryInfo(memoryInfo);Log.d("ActivityManager","memoryInfo availMem :"+memoryInfo.availMem);Log.d("ActivityManager","memoryInfo lowMemory :"+memoryInfo.lowMemory);Log.d("ActivityManager","memoryInfo threshold :"+memoryInfo.threshold); |
エラー情報、実行中のタスク情報は以下に続きます。
エラー情報を取得する
エラー状態(condition)にはCRASHED、NOT_RESPONDING、NO_ERRORがあり、応答のない状態として有名なANR(Application Not Responding)状態などが取得できます。
ActivityManager.ProcessErrorStateInfo
| メンバ | 説明 |
|---|---|
| condition | エラー状態(CRASHED/ANR/NO_ERROR) |
| crashData | nullが推奨値 |
| longMsg | エラーの説明文(長いほう)詳細 |
| shortMsg | エラーの説明文(短いほう)概要 |
| pid | 親プロセスID、ない場合は0 |
| processName | エラー・クラッシュしたプロセス名 |
| stackTrace | エラー発生時のスタックトレース |
| tag | エラー情報のタグ |
| uid | このプロセスに割り当てられているカーネルUserID |
今現在の実装では、エラー発生時のuid(UserID)は、エラーが起きたアプリケーション固有の番号ではありません。いくつかのアプリケーションで共有していますので注意が必要です。またエラー情報は、各プロセス(Activity)が正常な場合は取得しても空(null)となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | //エラー情報の取得List<ActivityManager.ProcessErrorStateInfo> errorStateInfo = activityManager.getProcessesInErrorState();if(errorStateInfo != null){ for (ActivityManager.ProcessErrorStateInfo error : errorStateInfo){ //エラー情報 Log.d("ActivityManager","error.condition :"+error.condition); // CRASHED,NOT_RESPONDING,NO_ERROR Log.d("ActivityManager","error.longMsg :"+error.longMsg); Log.d("ActivityManager","error.shortMsg :"+error.shortMsg); Log.d("ActivityManager","error.pid :"+error.pid); Log.d("ActivityManager","error.processName:"+error.processName); Log.d("ActivityManager","error.stackTrace :"+error.stackTrace); Log.d("ActivityManager","error.tag :"+error.tag); Log.d("ActivityManager","error.uid :"+error.uid); }} |
“running”状態のタスク情報を取得する
ここでいう実行状態(running)のタスク情報とは、(実際にLinux上で)プロセスが実行中で、活発に動いている状態を指すわけではありません。
システム上、”running”状態になっているタスク情報を取得することができます。極端なことを言うと、(システムのLowMemoryKillerなどが)特定のプロセスをKillしたケースであっても、(ユーザ操作により、アプリケーションを再起動するために)プロセスの状態は”running”を維持している可能性があります。
ActivityManager.RunningTaskInfo
| メンバ | 説明 |
|---|---|
| baseActivity | ComponentNameクラス。タスクで初めて起動したActivity |
| description | 現在の状態の概要 |
| id | ユニークなtaskID |
| numActivities | タスクのActivity数 |
| numRunning | running状態のActivity数 |
| thumbnail | Bitmap形式のサムネイル |
| topActivity | ComponentNameクラス。タスク・スタックの先頭Activity |
タスク状態を取得するにはパーミッションの設定が必要です。
AndroidManifest.xml
1 | <uses-permission android:name="android.permission.GET_TASKS" /> |
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //起動中のタスク情報// <uses-permission android:name="android.permission.GET_TASKS" /> パーミッションが必要List<ActivityManager.RunningTaskInfo> taskInfo = activityManager.getRunningTasks(5);//直近5つを取得if(taskInfo != null){ for (RunningTaskInfo task : taskInfo){ //エラー情報 Log.d("ActivityManager","task.id :"+task.id); Log.d("ActivityManager","task.description :"+task.description); Log.d("ActivityManager","task.numActivities:"+task.numActivities); Log.d("ActivityManager","task.numRunning :"+task.numRunning); }} |
About The Author
ひつじ(mhidaka)
Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org