Android获取当前前台包名/进程的方法

获取当前前台进程的方法有很多,不过有的方法在高版本安卓可能不好使,通常5.0之前的设备可以用ActivityManager的getRunningTasks方法,5.0使用ActivityManager的getRunningAppprocesses方法,5.1及之后版本可以用UsageStatsManager的queryEvents方法

封装成一个方法如下:

public static String getTopAppPackageName(Context context) {
    String packageName = "";
    ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    try {
        if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){
            List<ActivityManager.RunningTaskInfo> rti = activityManager.getRunningTasks(1);
            packageName = rti.get(0).topActivity.getPackageName();
        } else if(Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {
            List<ActivityManager.RunningAppProcessInfo> processes = activityManager.getRunningAppProcesses();
            if (processes.size() == 0) {
                return packageName;
            }
            for (ActivityManager.RunningAppProcessInfo process : processes) {
                if (process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    return process.processName;
                }
            }
        } else if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){
            final long end = System.currentTimeMillis();
            final UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService( Context.USAGE_STATS_SERVICE);
            if (null == usageStatsManager) {
                return packageName;
            }
            final UsageEvents events = usageStatsManager.queryEvents((end - 60 * 1000), end);
            if (null == events) {
                return packageName;
            }
            UsageEvents.Event usageEvent = new UsageEvents.Event();
            UsageEvents.Event lastMoveToFGEvent = null;
            while (events.hasNextEvent()) {
                events.getNextEvent(usageEvent);
                if (usageEvent.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
                    lastMoveToFGEvent = usageEvent;
                }
            }
            if (lastMoveToFGEvent != null) {
                packageName = lastMoveToFGEvent.getPackageName();
            }
        }
    }catch (Exception ignored){
    }
    return packageName;
}

其中5.1以上的api需要申请权限:

android.permission.PACKAGE_USAGE_STATS
private boolean isNoSwitch() {
    if (Build.VERSION.SDK_INT < 21) {
        return true;
    }
    List<UsageStats> queryUsageStats = ((UsageStatsManager) getApplicationContext().
            getSystemService(Context.USAGE_STATS_SERVICE))
            .queryUsageStats(4, 0, System.currentTimeMillis());
    return queryUsageStats != null && !queryUsageStats.isEmpty();
}
if (!isNoSwitch()) {
    Intent intent=new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK );
    startActivity(intent);
}

第二个方法是可以用dumpsym meminfo命令查看前台的app,匹配出来:


public static String do_exec_no_su(String cmd) {
    String s = "/n";
    try {
        Process p = Runtime.getRuntime().exec(cmd);
        BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            s += line + "/n";
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return s;

}
public static String getForgroundPack(){
String pack="";
    try {
        String meminfo=  do_exec_no_su(" dumpsys meminfo ");
        boolean foreground = meminfo.contains("Foreground");
        String[] foregrounds = meminfo.split("Foreground");
        String foreground1 = foregrounds[1];
        int i = foreground1.indexOf("(pid");
        foreground1=  foreground1.substring(0,i).trim();
        int i1 = foreground1.indexOf("kB:");
        pack = foreground1.substring(i1 + 3).trim().replace(" ","");
    } catch (Exception e) {
        LogUtil.e("出错:"+e.getMessage());
        e.printStackTrace();
    }
    return  pack;

}

第三个方法是直接读取/proc内容,遍历里面的文件,oom_score_adj值为0的


 private static String read(String path) throws IOException {

    StringBuilder output = new StringBuilder();

    BufferedReader reader = new BufferedReader(new FileReader(path));

    output.append(reader.readLine());

    for (String line = reader.readLine(); line != null; line = reader.readLine()) {

        output.append('\n').append(line);

    }

    reader.close();

    return output.toString();
}
    String () {

        File[] files = File().listFiles()String foregroundProcess = i = (File file : files) {
                i++Log.(+ file.getName()
                        + + i)(file.isFile()) {
                    }
                pidLog.(+ file.getName()){
                    pid = Integer.(file.getName())} (NumberFormatException e) {

                    }
                {
String cmdline = (String.(pid))String oomAdj = (String.(pid))Log.(+ oomAdj + + cmdline)(oomAdj.equalsIgnoreCase()) {
Log.(+ oomAdj + + cmdline)} {
                        }
                    (cmdline.contains() || cmdline.contains()) {
                        }
                    foregroundProcess = cmdline} (IOException e) {
                    e.printStackTrace()}

            }

            foregroundProcess}


Adam博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • Powered by bjyblog modified by Adam © 2014-2024 www.lixiaopeng.com 版权所有 ICP证:鲁ICP备15039297号
  • 联系邮箱:14846869@qq.com