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を利用することで簡単に取得できます。

        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);
	        }
        }
One Comment