ActivityManager 管理Activity[通俗易懂]

ActivityManager 管理Activity[通俗易懂]参考:https://www.jianshu.com/p/063fae89206bhttps://blog.csdn.net/qq_38520096/article/details/82109948https://blog.csdn.net/lanye11/article/details/52221359Activity可以获取运行中的应用信息,可以获取到servcie,process,ap…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

参考:https://www.jianshu.com/p/063fae89206b
https://blog.csdn.net/qq_38520096/article/details/82109948
https://blog.csdn.net/lanye11/article/details/52221359

Activity可以获取运行中的应用信息,可以获取到servcie,process,app,memory,Task信息等。

获取信息:

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;              
            }
        }
    }
}

ActivityManager 调用pushOneActivity,把一个activity压入栈中,可以创建一个BaseActivity,调用这个方法,其他Activity继承当前Activity

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityManager.getInstance().pushOneActivity(this);
    }
}

import android.app.Activity;
import java.util.Stack;

/**
 * ActivityManager
 *
 */
public class ActivityManager {
    private static ActivityManager instance;
    private Stack<Activity> activityStack;// activity栈

    // 单例模式
    public static ActivityManager getInstance() {
        if (instance == null) {
            instance = new ActivityManager();
        }
        return instance;
    }

    // 把一个activity压入栈中
    public void pushOneActivity(Activity actvity) {
        if (activityStack == null) {
            activityStack = new Stack<Activity>();
        }
        activityStack.add(actvity);
    }

    // 获取栈顶的activity,先进后出原则
    public Activity getLastActivity() {
        return activityStack.lastElement();
    }

    // 移除一个activity
    public void popOneActivity(Activity activity) {
        if (activityStack != null && activityStack.size() > 0) {
            if (activity != null) {
                activity.finish();
                activityStack.remove(activity);
                activity = null;
            }

        }
    }

    // 退出所有activity
    public void finishAllActivity() {
        if (activityStack != null) {
            while (activityStack.size() > 0) {
                Activity activity = getLastActivity();
                if (activity == null)
                    break;
                popOneActivity(activity);
            }
        }

    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2025年9月28日 上午10:22
下一篇 2025年9月28日 上午11:01


相关推荐

  • Tps是什么_PHP接口

    Tps是什么_PHP接口tps是啥?TPS,为Transactionprocessingsystems的缩写,是一个事务处理系统,又称为电子数据处理系统(electronicdataprocessingsystem,EDPS),它是指面向企业最底层的管理系统,对企业日常运作所产生的事务信息进行处理。特点:1、保持应用程序的完整性任何应用程序的关键是要确保它所执行的所有操作都是正确的,如果应用程序仅仅是部分地完…

    2022年10月9日
    2
  • 【C语言】4种方法求最大公约数和最小公倍数及比较它们的运行时间

    【C语言】4种方法求最大公约数和最小公倍数及比较它们的运行时间一、题目要求利用辗转相除法、穷举法、更相减损术、Stein算法求出两个数的最大公约数或者/和最小公倍数。最大公约数:指两个或多个整数共有约数中最大的一个。例如:【12和24】12的约数有:1、2、3、4、6、12;24的约数有:1、2、3、4、6、8、12、24。它们共有的约数为:1、2、3、4、6、12,则12和24的最大公约数为12…

    2022年5月17日
    48
  • nmap命令的详解

    nmap命令的详解使用-sP参数对对应主机段的主机发送ICMP报文,可以查询到哪些主机是存活的。[root@localhost~]#nmap-sP192.168.8.0/24StartingNmap6.40(http://nmap.org)at2018-07-1014:32CSTNmapscanreportfor192.168.8.0Hostisup(0….

    2022年5月8日
    51
  • 虚拟机上网的三种方式

    虚拟机上网的三种方式前言很多人安装虚拟机的时候,经常遇到不能上网的问题,而vmware有三种网络模式,对初学者来说也比较眼花聊乱,今天我就来基于虚拟机3种网络模式,帮大家普及下虚拟机上网的背景知识。(博文原创自http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html)虚拟机网络模式无论是vmware,virtualbox

    2022年5月19日
    49
  • css水平居中最佳写法

    css水平居中最佳写法ul position absolute left 50 li position relative right 50 此方法实现水平居中 兼容性强 扩展性强

    2026年3月17日
    2
  • Address Sanitizer 用法

    Address Sanitizer 用法AddressSanit ASan 是一个快速的内存错误检测工具 这里说明它的用法 参考资料 AddressSanit github com google sanitizers wiki AddressSanit 简介 AddressSanit ASan 是一个快速的内存错误检测工具 它非常快 只拖慢程序两倍左右 比起 Valgrind 快多了 它包括一个编译器 instrumentat 模块和一个提供 malloc free 替代项的运

    2026年3月18日
    2

发表回复

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

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