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を利用することで簡単に取得できます。
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)となります。
//エラー情報の取得 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
<uses-permission android:name="android.permission.GET_TASKS" />
サンプルコード
//起動中のタスク情報 // <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); } }