Android ActivityManager使用案例详解

 更新时间:2021年08月27日 15:29:27   作者:Wain丶  
这篇文章主要介绍了Android ActivityManager使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

前言

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

获取信息

  1. ActivityManager.MemoryInfo
    MemoryInfo中重要的字段:availMem(系统可用内存),totalMem(总内存),threshold(低内存阈值,即低内存的临界线),lowMemory(是否为低内存状态)
  2. Debug.MemoryInfo
    Debug.MemoryInfo主要用于获取进程下的内存信息。
  3. ActivityManager.RunningAppProcessInfo
    封装运行进程的信息,相关字段:processName(进程名),pid(进程pid),uid(进程uid),pkgList(该进程下所有的包)。
  4. ActivityManager.RunningServiceInfo
    用于封装运行的服务信息,但是其中除了服务进程信息外还有一些其它信息,activeSince(第一次被激活的时间、方式),foreground(服务是否在后台执行)。
  5. 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;              
            }
        }
    }
}

到此这篇关于Android ActivityManager使用案例详解的文章就介绍到这了,更多相关Android ActivityManager使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Flutter自定义弹窗Dialog效果

    Flutter自定义弹窗Dialog效果

    这篇文章主要为大家详细介绍了Flutter自定义弹窗Dialog效果,含底部抽屉,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Android开发之自定义UI组件详解

    Android开发之自定义UI组件详解

    这篇文章主要给大家介绍了关于Android开发之自定义UI组件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 完美解决EditText和ScrollView的滚动冲突(下)

    完美解决EditText和ScrollView的滚动冲突(下)

    这篇文章再次为大家详细介绍了完美解决EditText和ScrollView滚动冲突的方法,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android调试神器stetho使用详解和改造

    Android调试神器stetho使用详解和改造

    今天小编就为大家分享一篇关于Android调试神器stetho使用详解和改造,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法

    Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法

    这篇文章主要介绍了Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法,涉及Android界面布局与逻辑处理相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • Android Gridview布局出现滚动条或组件冲突解决方法

    Android Gridview布局出现滚动条或组件冲突解决方法

    这篇文章主要介绍了Android Gridview布局出现滚动条或组件冲突解决方法,GridView是一个在二维可滚动的网格中展示内容的控件。网格中的内容通过使用adapter自动插入到布局中
    2022-07-07
  • Android自动获取短信验证码功能

    Android自动获取短信验证码功能

    这篇文章主要介绍了Android自动获取短信验证码功能,通过自定义短信监听器用于自动填充验证码功能,具体实现代码大家可以参考下本文
    2017-04-04
  • Android 线程优化知识点学习

    Android 线程优化知识点学习

    这篇文章主要为大家介绍了Android线程优化知识点学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Android Studio 3.3.2 正式版的安装教程图解

    Android Studio 3.3.2 正式版的安装教程图解

    这篇文章主要介绍了Android Studio 3.3.2 正式版的安装教程图解,本文分步骤通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2020-02-02
  • Android结合kotlin使用coroutine的方法实例

    Android结合kotlin使用coroutine的方法实例

    这篇文章主要给大家介绍了关于Android结合kotlin使用coroutine的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论