大家好,又见面了,我是你们的朋友全栈君。
Android中Java层的ActivityManager类中封装了很多API,可以供我们查询当前系统的很多信息,包括:内存、进程(Process)、任务栈(Task)、服务(Service)等的相关信息。
利用这些信息可以进行一些有用的判断,例如判断当前系统内存是否不足、指定Service是否在运行中。
(ActivityManager类封装了很多API方法供上层调用,具体负责管理Activity、Service等组件的是 ActivityManagerService(AMS),而这些功能大部分是在native层实现的。 )
1.获取内存信息
代码语言:javascript复制//获取内存信息 //MemoryInfo比较重要的属性 // availMem:系统当前可用内存 // totalMem:系统总的内存 // threshold:系统判定自己内存不足的阀值,即临界值。低于该值时,系统会开始杀死一些优先级较低的服务和进程。 // lowMemory:当前是否处于第内存状态,若当前可用内存<=threshold,lowMemory为true
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
mActivityManager.getMemoryInfo(memoryInfo);
2.获取正在运行的进程信息
代码语言:javascript复制//获取正在运行的进程信息 //RunningAppProcessInfo重要属性 // importance:进程在系统中的优先级,值越低进程越不容易被杀死 // importanceReasonCode:进程的重要原因代码 // importanceReasonComponent:进程中组件的描述信息 // pkgList:被载入当前进程的所有包名 // processName:当前进程的名称 以下为Android常见的优先级对应值,值越低,对应的优先级越高,进程就越不容易被系统杀死: * ActivityManager.RunningAppProcessInfo. * IMPORTANCE_FOREGROUND=100, 运行着前台组件(可交互),或绑定前台组件的Service * IMPORTANCE_FOREGROUND_SERVICE=125, 运行着前台Service * IMPORTANCE_VISIBLE=200, 可见进程(有组件可见不可交互,或有绑定此类组件的Service) * IMPORTANCE_SERVICE=300, * IMPORTANCE_TOP_SLEEPING=325, * IMPORTANCE_CACHED=400, * IMPORTANCE_EMPTY=500, * IMPORTANCE_GONE=1000
List<ActivityManager.RunningAppProcessInfo> processInfoList = mActivityManager.getRunningAppProcesses();
3.获取正在运行的服务信息
代码语言:javascript复制//获取正在运行的服务信息 //官方文档中建议只在debug时使用该API,不要有重要的代码逻辑基于此API的结果 //RunningServiceInfo属性 // activeSince:服务第一次被激活的时间 (启动和绑定方式) // foreground: 是否为前台服务 // lastActivityTime:最后一个Activity与服务绑定的时间 // service:服务的组件名称 // started:若此值为true,则表示服务已经在启动运行中
List<ActivityManager.RunningServiceInfo> serviceInfoList = mActivityManager.getRunningServices(Integer.MAX_VALUE);
4.获取正在运行的任务栈信息
代码语言:javascript复制//获取正在运行的任务栈信息 //官方文档中建议只在debug时使用该API,不要有重要的代码逻辑基于此API的结果 //需要权限:<uses-permission android:name=”android.permission.GET_TASKS” /> //RunningTaskInfo重要属性 // baseActivity:栈底Activity // topActivity:栈顶Activity // numActivities: 栈中的全部Activity数量,包含已停止的 // numRunning,任务中运行中的Activity数量,不包含已停止的
List<ActivityManager.RunningTaskInfo> taskInfoList = mActivityManager.getRunningTasks(Integer.MAX_VALUE);
#.其它一些API
getDeviceConfigurationInfo () :获取设备信息 getProcessMemoryInfo(int[] pids):返回一个或多个进程当前的内存使用信息 killBackgroundProcesses(String packageName) :根据包名杀死对应进程 clearApplicationUserData() :清除当前App在内部存储空间中的缓存数据,等同于在手机设置中清除用户数据。 getAppTasks() :获取当前应用相关的任务栈列表 addAppTask (Activity activity, Intent intent, ActivityManager.TaskDescription description, Bitmap thumbnail) :为Activity创建新的任务栈,activity(需要创建任务栈的Activity),intent(用于跳转页面的Intent),description(描述信息),thumbnail(缩略图) getLauncherLargeIconSize () : 获取Launcher(启动器)图标大小 isUserAMonkey() :是否用户是否像“猴子”一样快速不断点击
##.应用示例
代码语言:javascript复制/**
* 获取指定APP包名对应的进程的优先级
* APP包名对应的进程是其默认进程名,一般为其最主要的进程。而且大多数APP只有这一个进程。
* 以下为Android常见的优先级对应值,值越低,对应的优先级越高,进程就越不容易被系统杀死:
* ActivityManager.RunningAppProcessInfo.
* IMPORTANCE_FOREGROUND=100, 运行着前台组件(可交互),或绑定前台组件的Service
* IMPORTANCE_FOREGROUND_SERVICE=125, 运行着前台Service
* IMPORTANCE_VISIBLE=200, 可见进程(有组件可见不可交互,或有绑定此类组件的Service)
* IMPORTANCE_SERVICE=300,
* IMPORTANCE_TOP_SLEEPING=325,
* IMPORTANCE_CACHED=400,
* IMPORTANCE_EMPTY=500,
* IMPORTANCE_GONE=1000
* @param packageName
* @return
*/
public int getAppProcessImportance(Context context, String packageName){
if(context == null || TextUtils.isEmpty(packageName)){
return Integer.MAX_VALUE;
}
init(context);
List<ActivityManager.RunningAppProcessInfo> processList = mActivityManager.getRunningAppProcesses();
if(processList == null || processList.size() == 0){
return Integer.MAX_VALUE;
}
for(ActivityManager.RunningAppProcessInfo processInfo : processList){
if(processInfo == null || TextUtils.isEmpty(processInfo.processName)){
continue;
}
if(processInfo.processName.equals(packageName)){
return processInfo.importance;
}
}
return Integer.MAX_VALUE;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/196300.html原文链接:https://javaforall.cn