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…


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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android之SharedPreferences简介[通俗易懂]

    SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity中重载窗口状态onSaveInstanceState保存一般使用SharedPreferences完成,它提供了Android平台常规的Long长整型、Int整型、String字符串型的保存.2个activity 之间的数据传递除了可以通过intent来传递,

    2022年3月9日
  • WAP网页设计入门 [转]「建议收藏」

    WAP网页设计入门 [转]「建议收藏」WAP网页设计入门[转]手机专用网页(WML篇)1.基本规则2.基本格式和文件头3.显示文本4.显示图片5.锚和任务6.显示表单7.事件8.CGI编程   这里介绍WAP协议标准组织所制定的标记语言WML,由于和以前介绍的HDML在手机浏览器专用网页的特征上基本一致,所以概念部分就略去了,直接讲述语言。1。基本规则  * WML使用XML文档字符集…

    2022年10月25日
  • CreateMutex、WaitForSingleObject、ReleaseMutex「建议收藏」

    CreateMutex、WaitForSingleObject、ReleaseMutex「建议收藏」我们对线程做一些简单的同步处理,这里我们用互斥量(Mutex)。互斥量(Mutex)和二元信号量类似,资源仅允许一个线程访问。与二元信号量不同的是,信号量在整个系统中可以被任意线程获取和释放,也就是说,同一个信号量可以由一个线程获取而由另一线程释放。而互斥量则要求哪个线程获取了该互斥量锁就由哪个线程释放,其它线程越俎代庖释放互斥量是无效的。在使用互斥量进行线程同步时会用到以下几个函数:HANDLEWINAPICreateMutex(LPSECURITY_ATTRIBUTESlpMute

    2022年6月26日
  • 2016TI杯——寻迹小车

    2016TI杯——寻迹小车首先,我选择的是B题————自动循迹小车,具体如下:B题:自动循迹小车1.任务设计制作一个自动循迹小车。小车采用一片TI公司LDC1314或LDC1000电感数字转换器作为循迹传感器,在规定的平面跑道自动按顺时针方向循迹前进。跑道的标识为一根直径0.6~0.9mm的细铁丝,按照图1的示意尺寸,用透明胶带将其贴在跑道上。图中所有圆弧的半径均为为20cm±2cm。图1跑道示意图

    2022年6月7日
  • 个性化推荐算法总结[通俗易懂]

    个性化推荐算法总结[通俗易懂]读书笔记|《推荐系统实践》-个性化推荐系统总结对于推荐系统,本文总结内容,如下图所示:一、什么是推荐系统1.为什么需要推荐系统为了解决互联网时代下的信息超载问题。2.搜索引擎与推荐系统分类目录,是将著名网站分门别类,从而方便用户根据类别查找公司。 搜索引擎,用户通过输入关键字,查找自己需要的信息。 推荐系统,和搜索引擎一样,是一种帮助用户快速发展有用信…

    2022年5月2日
  • VMM TEST「建议收藏」

    VMM TEST「建议收藏」vmm_testisintroducedinvmm1.1.Toknowthevmmversionwhichyouareusing,usethiscommandvcs-R-sverilog-ntb_optsdtm        +incdir+$VMM_HOME/sv$VMM_HOME/sv/vmm_versions.svv

    2022年9月22日

发表回复

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

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