ActivityManager解析及使用

ActivityManager解析及使用前言 Activity 可以获取运行中的应用信息 可以获取到 servcie process app memory 信息等 获取信息 ActivityMana MemoryInfoMe 中重要的字段 availMem 系统可用内存 totalMem 总内存 threshold 低内存阈值 即低内存的临界线 lowMemory 是否为低内存状态 Debug M

前言

获取信息
  • ActivityManager.MemoryInfo
    MemoryInfo中重要的字段:availMem(系统可用内存),totalMem(总内存),threshold(低内存阈值,即低内存的临界线),lowMemory(是否为低内存状态)
  • Debug.MemoryInfo
    Debug.MemoryInfo主要用于获取进程下的内存信息。
  • ActivityManager.RunningAppProcessInfo
    封装运行进程的信息,相关字段:processName(进程名),pid(进程pid),uid(进程uid),pkgList(该进程下所有的包)。
  • ActivityManager.RunningServiceInfo
    用于封装运行的服务信息,但是其中除了服务进程信息外还有一些其它信息,activeSince(第一次被激活的时间、方式),foreground(服务是否在后台执行)。
  • ActivityManager.RunningTaskInfo
    用于封装Task信息,包含id(该任务的唯一标识),baseActivity(该任务栈的基础Activity),topActivity(该任务栈栈顶的Activity),numActivities(该任务栈中Activity数量),description(任务当前状态描述)等。
ActivityManager常用方法
  • clearApplicationUserData() :用于清除用户数据,等同于在手机设置中清除用户数据。
  • addAppTask (Activity activity, Intent intent, ActivityManager.TaskDescription description, Bitmap thumbnail) :为Activity创建新的任务栈,activity(需要创建任务栈的Activity),intent(用于跳转页面的Intent),description(描述信息),thumbnail(缩略图)
  • getDeviceConfigurationInfo () :获取设备信息
  • getLauncherLargeIconSize () : 获取Launcher(启动器)图标大小
  • getMemoryInfo (ActivityManager.MemoryInfo outInfo) : 获取系统当前内存信息
  • getProcessMemoryInfo():返回一个或者多个进程使用内存的情况
  • getRunningAppProcesses() :获取该设备上应用程序进程列表
  • getAppTasks() :获取当前应用任务列表
  • isUserAMonkey() :是否用户是一个猴子,用于判断键盘是否被乱按
  • killBackgroundProcesses(String packageName) :根据包名杀死对应进程
  • getRunningTasks (int maxNum) :获取正在运行的任务列表
  • getRecentTasks (int maxNum, int flags) :获取用户启动的任务列表
  • getMyMemoryState (ActivityManager.RunningAppProcessInfo outState) :获取该进程的全局内存状态
判断应用是否在前台运行,应用是否在运行
//判断应用是否在前台运行 public boolean isRunningForeground(Context context){ String packageName=getPackageName(context); String topActivityClassName=getTopActivityName(context); System.out.println("packageName="+packageName+",topActivityClassName="+topActivityClassName); if (packageName!=null&&topActivityClassName!=null&&topActivityClassName.startsWith(packageName)) { System.out.println("应用在前台执行"); return true; } else { System.out.println("应用在后台执行"); return false; } } // 判断应用是否在运行 public boolean isRun(Context context,String mPackageName){ ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningTaskInfo> list = am.getRunningTasks(100); boolean isAppRunning = false; //100表示取的最大的任务数,info.topActivity表示当前正在运行的Activity,info.baseActivity表示系统后台有此进程在运行 for (RunningTaskInfo info : list) { if (info.topActivity.getPackageName().equals(mPackageName) || info.baseActivity.getPackageName().equals(mPackageName)) { isAppRunning = true; Log.i("ActivityService",info.topActivity.getPackageName() + " info.baseActivity.getPackageName()="+info.baseActivity.getPackageName()); break; } } if(isAppRunning){ Log.i("ActivityService", "该程序正在运行"); }else{ Log.i("ActivityService", "该程序没有运行"); } return isAppRunning; } //获取栈顶ActivityName public String getTopActivityName(Context context){ String topActivityClassName=null; ActivityManager activityManager = (ActivityManager)(context.getSystemService(android.content.Context.ACTIVITY_SERVICE )) ; List<runningtaskinfo> runningTaskInfos = activityManager.getRunningTasks(1) ; if(runningTaskInfos != null){ ComponentName f=runningTaskInfos.get(0).topActivity; topActivityClassName=f.getClassName(); } return topActivityClassName; } public String getPackageName(Context context){ String packageName = context.getPackageName(); return packageName; }
自定义ActivityManager管理Activity

  我们需要定义一个自己的ActivityManager,并且在BaseActivity中的OnCreate方法里将启动的Activity通过我们自定义的ActivityManager把任务放入栈中,在onDestroy方法中将Activity退栈。

/ * 用于管理Activity,获取Activity * 在结束一个activity后应该判断当前栈是否为空,为空则将本类引用置为null,以便于虚拟机回收内存 * 单例,调用 {@link #getActivityManager()} 获取实例 * 成员变量 {@link #mActivityStack} 应该与系统的回退栈保持一致,所以在启动activity的时候必须在其onCreate中 * 将该activity加入栈顶,在activity结束时,必须在onDestroy中将该activity出栈 */ public class ActivityManager { 
    private static ReStack<Activity> mActivityStack; //Activity栈 private static ActivityManager mInstance; private ActivityManager() { mActivityStack = new ReStack<>(); } / * 获取ActivityManager的单例. * * @return ActivityManager实例 */ public static ActivityManager getActivityManager() { if (mInstance == null) { mInstance = new ActivityManager(); } return mInstance; } / * 添加一个activity到栈顶. * * @param activity 添加的activity */ public void pushActivity(Activity activity) { if (mActivityStack == null) { mActivityStack = new ReStack<>(); } mActivityStack.push(activity); } / * 获取栈顶的Activity. * * @return 如果栈存在, 返回栈顶的activity */ public Activity peekActivity() { if (mActivityStack != null && !mActivityStack.isEmpty()) { return mActivityStack.peek(); } else { return null; } } / * 结束当前的activity,在activity的onDestroy中调用. */ public void popActivity() { if (mActivityStack != null && !mActivityStack.isEmpty()) { mActivityStack.pop(); } //如果移除一个activity之后栈为空,将本类的引用取消,以便于让虚拟机回收 if (mActivityStack != null && mActivityStack.isEmpty()) { mInstance = null; } } / * 结束最接近栈顶的匹配类名的activity. * 遍历到的不一定是被结束的,遍历是从栈底开始查找,为了确定栈中有这个activity,并获得一个引用 * 删除是从栈顶查找,结束查找到的第一个 * 在activity外结束activity时调用 * * @param klass 类名 */ public void popActivity(Class<? extends BaseActivity> klass) { for (Activity activity : mActivityStack) { if (activity != null && activity.getClass().equals(klass)) { activity.finish(); break; //只结束一个 } } } //移除所有的Activity public void removeAll(){ for (Activity activity : mActivityStack) { if (activity != null) { activity.finish(); break; } } } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233206.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql分区表详解_详解MySQL分区表「建议收藏」

    mysql分区表详解_详解MySQL分区表「建议收藏」前言:分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表。但是对于应用程序来讲,分区的表和没有分区的表是一样的。换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理。本篇文章给大家带来的内容是关于MySQL中分区表的介绍及使用场景,有需要的朋友可以参考一下,希望对你有所帮助。1.分区的目的及分区类型MySQL在创建表的时候可以通过使用PARTITIONBY子句定…

    2022年4月30日
    66
  • RTU远程测控终端[通俗易懂]

    RTU远程测控终端[通俗易懂]RTU远程测控终端是一种基于无线网络通信的物联网智能终端设备,测控终端集A/D功能和I/O功能为一体,负责对现场信号、工业设备的监测和控制。RTU远程测控终端输出控制信号,控制继电器输出,从而达到对远

    2022年8月6日
    5
  • Android应用开发揭秘14「建议收藏」

    Android应用开发揭秘14「建议收藏」Android应用开发揭秘14

    2022年5月27日
    29
  • Axios跨域请求配置「建议收藏」

    Axios跨域请求配置「建议收藏」    React中用到的网络代理请求是axios,它在使用的过程中,会存在一些问题,今天就分享我遇到过的一些问题1、跨域请求后台配置:在SpringBoot项目中的,需要实现WebMvcConfigurer,并且重写addCrosMappings方法@ConfigurationpublicclassApplicationAutoConfigurationimplementsWebMvcConfigurer{ @Override public

    2022年9月11日
    2
  • vue路由懒加载实现_vue路由懒加载实现原理

    vue路由懒加载实现_vue路由懒加载实现原理某些情况下,一个页面的path路径可能是不确定的,比如我们进入用户界面时,希望是如下的路径:/user/aaaa或/user/bbbb。p除了有前面的/user之外,后面还跟上了用户的ID。这种path和Component的匹配关系,我们称之为动态路由(也是路由传递数据的一种方式)。1、配置router2、使用路由3、创造用户组件并使用传进来的用户信息在compute中用this.$route.params.userId,但是mustache语法中直接$route.pa

    2022年10月7日
    2
  • idea快捷键不生效_idea列模式快捷键

    idea快捷键不生效_idea列模式快捷键1、如果是某些快捷键不气作用,这有可能与通讯工具、输入法、浏览器等的快捷键冲突2、如果所有的快捷键都不气作用,这时点击idea开发工具上的“Tools”然后将”VimEmulator”这个选项的√去掉。如图…

    2022年9月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号