Android中ActivityManager学习笔记

Posted Q博士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中ActivityManager学习笔记相关的知识,希望对你有一定的参考价值。

在之前写过2篇关于ActivityManager的文章,如下所示。都是通过实战去了解里面的信息,现在感觉太繁琐,所以做一个api介绍比较详细。就像之前学习Telephony那样,对整体了解整个ActivityManager很有用。


Android中ActivityManager学习笔记(1)-MemoryInfo

Android中ActivityManager学习笔记(2)-RunningServiceInfo


ActivityManager


android.app包,含有6个内部类:

  • MemoryInfo
  • ProcessErrorStateInfo
  • RecentTaskInfo
  • RunningAppProcessInfo
  • RunningServiceInfo
  • RunningTaskInfo


先从ActivityManager API下手。


Constants


META_HOME_ALTERNATE

主activity中的<meta-data>标签值

MOVE_TASK_NO_USER_ACTION

对于用户策动的活动,当前activity不会收到提示

MOVE_TASK_WITH_HOME

将后面的任务立即移动到前面

RECENT_IGNORE_UNAVAILABLE

提供一份不包含任何当前任务的列表,这些任务对于用户是不可见的

RECENT_WITH_EXCLUDED

返回所有的任务


Methods


public boolean clearApplicationUserData()


清楚用户数据


public void dumpPackageState(FileDescriptor fd, String packageName)


获取相应包名对应的apk的各种状态信息


public ConfigurationInfo getDeviceConfigurationInfo ()


获取设备配置信息


public int getLargeMemoryClass()


当一个应用程序在一个大的堆栈空间里运行时,估算当前设备中每一个应用内存片段的值


public int getLauncherLargeIconDensity()


Lancher启动器的图标像素密度


public int getLauncherLargeIconSize()


启动器图标大小


public int getLauncherLargeIconSize()


当前设备每个应用的内存分类,就是内存的底线。低于这个值应用就会崩溃。


public void getMemoryInfo(ActivityManager.MemoryInfo outInfo)


当前系统的内存信息


public static void getMyMemoryState(ActivityManager.RunningAppProcessInfo outState)


返回调用者进程的全局内存状态信息。


public MemoryInfo[] getProcessMemoryInfo(int[] pids)


进程所使用的内存信息


public List<ActivityManager.ProcessErrorStateInfo>getProcessesInErrorState ()


当系统发生错误的时候,获取当前运行的一些进程的信息


public List<ActivityManager.RecentTaskInfo>getRecentTasks (int maxNum, int flags)


用户启动的任务列表


public List<ActivityManager.RunningAppProcessInfo>getRunningAppProcesses ()


当前设备运行着的应用进程信息


public PendingIntent getRunningServiceControlPanel(ComponentName service)


返回一个PendingIntent,该PendingIntent会启动一个控制面板,里面会显示当前系统运行的一系列服务。


public List<ActivityManager.RunningServiceInfo>getRunningServices (int maxNum)


当前运行的服务信息


public List<ActivityManager.RunningTaskInfo>getRunningTasks (int maxNum)


当前系统运行的任务信息


public boolean isLowRamDevice()


是否是低内存的设备


public static boolean isRunningInTestHarness()


判断设备是否运行在测试框架中


public static boolean isUserAMonkey()


判断当前设备是否被Monkey乱点中


public void killBackgroundProcesses(String packageName)


杀死对应包的后台进程


public void moveTaskToFront(int taskId, int flags, Bundle options)

public void moveTaskToFront(int taskId, int flags)


讲给定的id对应的任务移动到任务栈队列的最前面。


public void restartPackage(String packageName)


在API 8中已废除


Nested class


MemoryInfo


通过getMemoryInfo(ActivityManager.MemoryInfo)获得该对象,可以用来检索有效的内存信息


Fields

public long availMem


系统中的可见内存


public boolean lowMemory


系统判断自己是否处于低内存的情况


public long threshold


当内存太低,开始杀死后台服务和其他非外来的进程时,内存的临界值


public long totalMem


内核中所有内存数


ProcessErrorStateInfo


在发生错误时,检索内存中的有关信息


Constans:


int CRASHED:奔溃

int NOT_RESPONDING:无回应

int NO_ERROR:0.状况码,无错误


Fields


public int condition:进程中的状态码

public byte[] crashData:(已经被弃用),空值

public String longMsg:一个表述错误状态的长信息

pubic int pid:进程id

pubic String processName:发生错误或奔溃的进程的进程名称

public String shortMsg:错误码的缩写

public String stackTrace:错误发生时的堆栈跟踪信息

public String tag:与错误有关的activity名

public int uid:用户id


RecentTaskInfo


用户最近访问和启动的任务信息


Fields


public Intent baseIntent:启动任务的原始Intent,可以用它重启任务或者将当前任务移动到任务列表的最前面

public CharSequence description:描述任务上次的状态

public int id:唯一标识当前运行的任务

public ComponentName origActivity:intent启动的实体控件

public int persistentId:任务的永久id号,不管该任务有没有运行


RunningAppProcess


与正在运行的进程有关信息可以通过该类获得。


Constants


IMPORTANCE_BACKGROUND:importance变量的值之一。处于后台,但是仍然消耗资源的进程

IMPORTANCE_EMPT:importance变量的值之一。空进程

IMPORTANCE_FOREGROUND:importance变量的值之一。处于用户界面的进程。

IMPORTANCE_PERCEPTIBLE:同上。仍然运行着某些对用户有用的的东西

IMPORTANCE_SERVICE:同上。该进程包含仍在运行的服务

IMPORTANCE_VISIBLE:同上。运行某些对用户可见的东西,但不是立即显示在UI界面上,

REASON_PROVIDER_IN_USE:importanceReasonCode变量的值之一。应用的content provider中正被其他进程调用

REASON_SERVICE_IN_USE:同上。

REASON_UNKNOWN:同上。无特殊原因


Fields


public int importance:重要性等级

public int importanceReasonCode:重要原因code

public ComponentName importanceReasonComponent:到当前进程中使用的组件名

public int importanceReasonPid:进程客户端其他进程的进程id。

public int lastTrimLevel:报告给进程最后内存的等级

public int lru:近期最少使用算法,即为importance进行排序。

public int pid:进程id

public String[] pkgList:该进程加载的所有包名

public String processName:与当前对象相关的进程名称

public int uid:用户id


RunningServiceInfo


当前系统中运行的特殊服务


Constants


FLAG_FOREGROUND:前台进程

FLAG_PERSISTENT_PROCESS:持续进程

FLAG_STARTED:已启动

FLAG_SYSTEM_PROCESS:核心系统进程


Fields


public long activeSince:第一次启动的时间

public int clientCount:连接到该服务的客户端数量

public int clientLabel:客户端标签

public String clientPackage:客户端包名

public int crashCount:在服务运行过程中奔溃的次数

public int flags:运行标志

public boolean foreground:判断是否位于前端UI界面上

public long lastActivityTime:最后的活动时间

public int pid:进程id

public String process:服务所在的进程名

public long restarting:重新启动的时间,如果非空,代表该服务当前不在运行。等待一段时间后重启。

public ComponentName service:服务组件

public boolean started:是否已经启动

public int uid:用户id


RunningTaskInfo


当前在系统中运行的特定任务信息,这些任务不是意味着有进程活动的任务,而是简单的标识用户已经离开该任务,但是没有关闭,但是当前系统可能会杀死该进程,只支持它的状态,等用户返回后重新启动。


Fields


public ComponentName baseActivity:任务中第一次启动的activity.

public CharSquence description:任务当前状态的描述

public int id:任务id

public int numActivities:当前任务中活跃的activity数

public in numRunning:当前任务中运行的activity数(没有停止和持续的activity)

public Bitmap thumbnail:当前状态的缩略图

public ComponentName topActivity:任务历史栈最上层的activity.



总结


这一篇文章从ActivityManager讲起,逐渐讲解了其中的6个内部类,代表程序运行过程中所涉及到的各个进程、app、service、task的信息。对ActivityManager所管理的内容有了初步的了解。


前辈文章

以上是关于Android中ActivityManager学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Android的Framework分析---5 ActivityManager分析

Android-ActivityManager 退出整个应用

Delphi Android ActivityManager

android中的哪个进程要求ActivityManager广播BOOT_COMPLETED

Android应用程序崩溃ActivityManager权限在Eclipse上被拒绝

Android:如何在 ActivityManager.getRunningTasks 中找不到活动时将其移动到前面