activity详解_activity教程

activity详解_activity教程前言Activity可以获取运行中的应用信息,可以获取到servcie,process,app,memory信息等。获取信息ActivityManager.MemoryInfoMemoryInfo中重要的字段:availMem(系统可用内存),totalMem(总内存),threshold(低内存阈值,即低内存的临界线),lowMemory(是否为低内存状态)Debug.M…

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

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

前言

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

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

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


相关推荐

  • linux 同步北京时间 局域网同步时间

    linux 同步北京时间 局域网同步时间如果不是北京时间先改成北京时间1.删除自带的localtimerm-rf/etc/localtime2.创建软链接到localtimeln-s/usr/share/zoneinfo/Asia/Shanghai/etc/localtime在同步时间方法一:使用ntpdate比较简单安装ntpdateyuminstallntpdatentpdate…

    2022年7月16日
    11
  • π弧度转化成角度为_角度化成弧度公式

    π弧度转化成角度为_角度化成弧度公式这两天在看同事写的四叉树代码,其中用到了孤度和角度之间的转换,所以转载此文章进行了学习弧度与角度的关系一、角的两种单位“弧度”和“度”是度量角大小的两种不同的单位。就像“米”和“市尺”是度量长度大小

    2022年8月3日
    4
  • VMWare的P2V、V2V使用「建议收藏」

    VMWare的P2V、V2V使用「建议收藏」1.测试环境2.软件安装双击安装文件,依次点击”下一步”,如下图:3.软件参数修改4.将物理机(192.168.80.103)转换到ESXI(192.168.80.102)在Windows10中安装vCenterConverter6转换软件,将WindowsServer2008R2或WindowsServer2012R2转换到ESXI主机。转换前注意事项:登录到…

    2022年7月14日
    18
  • C# Winform 窗体美化(目录)

    C# Winform 窗体美化(目录)最近在看C#Winform的窗体美化,发现一些很有用的美化皮肤库,学习过后也把一些资料整理一下。一、IrisSkin换肤库(IrisSkin4)二、LayeredSkin界面库(LayeredSkinDemo)三、不规则窗体(GoldFishProject,TransparentForm)四、镂空窗体(HollowForm)五、鼠标穿透(MousePenetration)

    2022年5月28日
    34
  • E. Riding in a Lift(Codeforces Round #274)「建议收藏」

    E. Riding in a Lift(Codeforces Round #274)

    2022年1月25日
    67
  • html清空所有cookie,document.cookie使用详解

    html清空所有cookie,document.cookie使用详解概念相关:cookie是存于用户硬盘上的一个文件,对应一个域名,当浏览器再次访问这个域名时,便使用这个cookie。cookie可以跨越一个域名下的多个网页,但不能跨越多个域名使用。cookie是浏览器相关的。即使访问的是同一个页面,不同浏览器之间所保存的cookie也是不能互相访问的。cookie安全性不够高。所有的cookie都是以纯文本的形式记录于文件中,因此如果要保存用户名密码等信息…

    2022年7月11日
    12

发表回复

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

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