ActivityManager服務是對Activity管理、運行時功能管理和運行時數據結構的封裝,進程(Process)、應用程序/包、服務(Service)、任務(Task)信息等。包括以下功能:
- 激活/去激活activity
- 注冊/取消注冊動態接受intent
- 發送/取消發送intent
- activity生命周期管理(暫停,恢復,停止,銷毀等)
- activity task管理(前台->后台,后台->前台,最近task查詢,運行時task查詢)
- 激活/去激活service
- 激活/去激活provider等
常用內部靜態類有:
ActivityManager.MemoryInfo: 系統可用內存信息
ActivityManager.RecentTaskInfo: 最近的任務信息
ActivityManager.RunningAppProcessInfo: 正在運行的進程信息
ActivityManager.RunningServiceInfo: 正在運行的服務信息
ActivityManager.RunningTaskInfo: 正在運行的任務信息
用法:
1.獲取ActivityManager服務:
ActivityManager mActivityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
2.獲取內存信息:
MemoryInfo memoryInfo = new MemoryInfo() ;
mActivityManager.getMemoryInfo(memoryInfo);
3.獲取正在運行的task信息:
List<RunningTaskInfo> runningTaskInfos = mActivityManager.getRunningTasks(Integer.MAX_VALUE); String cmpNameTemp = null; if (null != runningTaskInfos) { cmpNameTemp = (runningTaskInfos.get(0).topActivity).toString(); }
4.判斷android應用是否在前台:
public static boolean isAppOnForeground(Context context) { ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); String packageName = context.getPackageName(); List<RecentTaskInfo> appTask = activityManager.getRecentTasks(Integer.MAX_VALUE, 1); if (appTask == null) { return false; } if (appTask.get(0).baseIntent.toString().contains(packageName)) { return true; } return false; }
5.獲取android手機內安裝的所有桌面:
private static List<String> getAllTheLauncher(Context context) { List<String> names = null; PackageManager pkgMgt = context.getPackageManager(); Intent it = new Intent(Intent.ACTION_MAIN); it.addCategory(Intent.CATEGORY_HOME); List<ResolveInfo> ra = pkgMgt.queryIntentActivities(it, 0); if (ra.size() != 0) { names = new ArrayList<String>(); } for (int i = 0; i < ra.size(); i++) { String packageName = ra.get(i).activityInfo.packageName; names.add(packageName); } return names; }
6.判斷程序前后台狀態:
public static boolean isLauncherRunning(Context context) { boolean result = false; List<String> names = getAllTheLauncher(context); ActivityManager mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> appList = mActivityManager.getRunningAppProcesses(); for (RunningAppProcessInfo running : appList) { if (running.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { for (int i = 0; i < names.size(); i++) { if (names.get(i).equals(running.processName)) { result = true; break; } } } } return result; }
7.獲取系統中進程信息:
private void getRunningAppProcessInfo() {
processInfoList = new ArrayList<ProcessInfo>();
List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcessInfo : appProcessList) {
int pid = appProcessInfo.pid;
int uid = appProcessInfo.uid;
String processName = appProcessInfo.processName;
int[] myMempid = new int[] { pid };
Debug.MemoryInfo[] memoryInfo = mActivityManager.getProcessMemoryInfo(myMempid);
int memSize = memoryInfo[0].dalvikPrivateDirty;
Log.i(TAG, "processName: " + processName + " pid: " + pid
+ " uid:" + uid + " memorySize is -->" + memSize + "kb");
// 構造一個ProcessInfo對象
ProcessInfo processInfo = new ProcessInfo();
processInfo.setPid(pid);
processInfo.setUid(uid);
processInfo.setMemSize(memSize);
processInfo.setPocessName(processName);
processInfoList.add(processInfo);
// 獲得每個進程里運行的應用程序(包),即每個應用程序的包名
String[] packageList = appProcessInfo.pkgList;
Log.i(TAG, "process id is " + pid + "has " + packageList.length);
for (String pkg : packageList) {
Log.i(TAG, "packageName " + pkg + " in process id is -->"+ pid);
}
}
}