Android5.1.+ getRunningAppProcesses()获取运行中进程(第三方开源库)

google可能为了安全考虑,在5.1.+后调用activitymanager.getRunningAppProcesses()方法只能返回你自己应用的进程,那如何在5.1.+后获取运行中进程呢?一个大神stackoverflow给出了答案(点击跳转)。如果你能熟练的导入第三方库,那么相信你可以不用向下看了,如果你选择向下看,那我会用白话文教你一步步实现。首先到这位答主的github上下载他上传的开源库,梯子自备(点击跳转)。没有梯子可以到我的个人百度云下载:链接: http://pan.baidu.com/s/1kVjjPsF 密码: ag6u
这里写图片描述
下载完成后解压目录结构
结构
我们只需要其中的红线框住的部分,但是直接导入,肯定会处很多的问题,我们先来处理一部分,打开libsuperuser
这里写图片描述其中你框选的三个文件是我们要注意的。如果要导入的文件中有build.gradle或AndroidManifest.xml、project.properties文件,需要将其用记事本打开后,将里面的gradle及Android版本修改为自己使用的,如果不知道的话可以新建一个工程或者打开以前建的工程中的相关文件进行对比查看。
这里写图片描述
修改完成后来到android studio的project视图下将他粘贴进去
这里写图片描述
粘贴进去肯定会叫你同步,然后就同步罗,会发现一些问题,其中常见的是提示:
Error:(2, 0) Plugin with id ‘com.github.dcendents.android-maven’ not found
Error:(2, 0) Plugin with id ‘com.jfrog.bintray.gradle’ not found
这是因为有两个插件我们没有装上,我们来到Project下,在那个build.grade里面添加全局依赖
这里写图片描述
将这两个依赖的插件写上,建议写一个同步一次分两次进行,第二次下载需要比较长的时间

<code class="hljs cs has-numbering">       <span class="hljs-comment">//自动化maven打包插件</span>
        classpath <span class="hljs-string">'com.github.dcendents:android-maven-gradle-plugin:1.3'</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul>
<code class="hljs cs has-numbering">       <span class="hljs-comment">//自动上传至bintray插件</span>
        classpath <span class="hljs-string">"com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0"</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li></ul>

填写好后我们会发现没有编译错误了,那我们要怎么去用添加的这个开源库呢??来到android视图下的build.gradle(Module.app)下添加依赖
这里写图片描述

<code class="hljs bash has-numbering"> compile <span class="hljs-string">'eu.chainfire:libsuperuser:1.0.0.+'</span></code><ul style="" class="pre-numbering"><li>1</li></ul>

重新同步后,我们就可以调用里面的方法了,新建一个ProgressManager类

<code class="hljs java has-numbering"><span class="hljs-keyword">import</span> android.content.Context;
<span class="hljs-keyword">import</span> android.content.pm.ApplicationInfo;
<span class="hljs-keyword">import</span> android.content.pm.PackageInfo;
<span class="hljs-keyword">import</span> android.content.pm.PackageManager;
<span class="hljs-keyword">import</span> android.os.Build;
<span class="hljs-keyword">import</span> android.os.Parcel;
<span class="hljs-keyword">import</span> android.os.Parcelable;

<span class="hljs-keyword">import</span> java.util.ArrayList;
<span class="hljs-keyword">import</span> java.util.List;

<span class="hljs-keyword">import</span> eu.chainfire.libsuperuser.Shell;

<span class="hljs-javadoc">/**
 *<span class="hljs-javadoctag"> @author</span> Jared Rummler
 */</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ProcessManager</span> {</span>

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TAG = <span class="hljs-string">"ProcessManager"</span>;

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String APP_ID_PATTERN;

    <span class="hljs-keyword">static</span> {
        <span class="hljs-keyword">if</span> (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            <span class="hljs-comment">// Android 4.2 (JB-MR1) changed the UID name of apps for multiple user account support.</span>
            APP_ID_PATTERN = <span class="hljs-string">"u\\d+_a\\d+"</span>;
        } <span class="hljs-keyword">else</span> {
            APP_ID_PATTERN = <span class="hljs-string">"app_\\d+"</span>;
        }
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> List<Process> <span class="hljs-title">getRunningProcesses</span>() {
        List<Process> processes = <span class="hljs-keyword">new</span> ArrayList<>();
        List<String> stdout = Shell.SH.run(<span class="hljs-string">"toolbox ps -p -P -x -c"</span>);
        <span class="hljs-keyword">for</span> (String line : stdout) {
            <span class="hljs-keyword">try</span> {
                processes.add(<span class="hljs-keyword">new</span> Process(line));
            } <span class="hljs-keyword">catch</span> (Exception e) {
                android.util.Log.d(TAG, <span class="hljs-string">"Failed parsing line "</span> + line);
            }
        }
        <span class="hljs-keyword">return</span> processes;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> List<Process> <span class="hljs-title">getRunningApps</span>() {
        List<Process> processes = <span class="hljs-keyword">new</span> ArrayList<>();
        List<String> stdout = Shell.SH.run(<span class="hljs-string">"toolbox ps -p -P -x -c"</span>);
        <span class="hljs-keyword">int</span> myPid = android.os.Process.myPid();
        <span class="hljs-keyword">for</span> (String line : stdout) {
            <span class="hljs-keyword">try</span> {
                Process process = <span class="hljs-keyword">new</span> Process(line);
                <span class="hljs-keyword">if</span> (process.user.matches(APP_ID_PATTERN)) {
                    <span class="hljs-keyword">if</span> (process.ppid == myPid || process.name.equals(<span class="hljs-string">"toolbox"</span>)) {
                        <span class="hljs-comment">// skip the processes we created to get the running apps.</span>
                        <span class="hljs-keyword">continue</span>;
                    }
                    processes.add(process);
                }
            } <span class="hljs-keyword">catch</span> (Exception e) {
                android.util.Log.d(TAG, <span class="hljs-string">"Failed parsing line "</span> + line);
            }
        }
        <span class="hljs-keyword">return</span> processes;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Process</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">Parcelable</span> {</span>

        <span class="hljs-javadoc">/** User name */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> String user;

        <span class="hljs-javadoc">/** User ID */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> uid;

        <span class="hljs-javadoc">/** Processes ID */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> pid;

        <span class="hljs-javadoc">/** Parent processes ID */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> ppid;

        <span class="hljs-javadoc">/** virtual memory size of the process in KiB (1024-byte units). */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> vsize;

        <span class="hljs-javadoc">/** resident set size, the non-swapped physical memory that a task has used (in kiloBytes). */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> rss;

        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> cpu;

        <span class="hljs-javadoc">/** The priority */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> priority;

        <span class="hljs-javadoc">/** The priority, <a href="https://en.wikipedia.org/wiki/Nice_(Unix)">niceness</a> level */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> niceness;

        <span class="hljs-javadoc">/** Real time priority */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> realTimePriority;

        <span class="hljs-javadoc">/** 0 (sched_other), 1 (sched_fifo), and 2 (sched_rr). */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> schedulingPolicy;

        <span class="hljs-javadoc">/** The scheduling policy. Either "bg", "fg", "un", "er", or "" */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> String policy;

        <span class="hljs-javadoc">/** address of the kernel function where the process is sleeping */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> String wchan;

        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> String pc;

        <span class="hljs-javadoc">/**
         * Possible states:
         * <p/>
         * "D" uninterruptible sleep (usually IO)
         * <p/>
         * "R" running or runnable (on run queue)
         * <p/>
         * "S" interruptible sleep (waiting for an event to complete)
         * <p/>
         * "T" stopped, either by a job control signal or because it is being traced
         * <p/>
         * "W" paging (not valid since the 2.6.xx kernel)
         * <p/>
         * "X" dead (should never be seen)
         * </p>
         * "Z" defunct ("zombie") process, terminated but not reaped by its parent
         */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> String state;

        <span class="hljs-javadoc">/** The process name */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> String name;

        <span class="hljs-javadoc">/** user time in milliseconds */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> userTime;

        <span class="hljs-javadoc">/** system time in milliseconds */</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">long</span> systemTime;

        <span class="hljs-comment">// Much dirty. Much ugly.</span>
        <span class="hljs-keyword">private</span> <span class="hljs-title">Process</span>(String line) <span class="hljs-keyword">throws</span> Exception {
            String[] fields = line.split(<span class="hljs-string">"\\s+"</span>);
            user = fields[<span class="hljs-number">0</span>];
            uid = android.os.Process.getUidForName(user);
            pid = Integer.parseInt(fields[<span class="hljs-number">1</span>]);
            ppid = Integer.parseInt(fields[<span class="hljs-number">2</span>]);
            vsize = Integer.parseInt(fields[<span class="hljs-number">3</span>]) * <span class="hljs-number">1024</span>;
            rss = Integer.parseInt(fields[<span class="hljs-number">4</span>]) * <span class="hljs-number">1024</span>;
            cpu = Integer.parseInt(fields[<span class="hljs-number">5</span>]);
            priority = Integer.parseInt(fields[<span class="hljs-number">6</span>]);
            niceness = Integer.parseInt(fields[<span class="hljs-number">7</span>]);
            realTimePriority = Integer.parseInt(fields[<span class="hljs-number">8</span>]);
            schedulingPolicy = Integer.parseInt(fields[<span class="hljs-number">9</span>]);
            <span class="hljs-keyword">if</span> (fields.length == <span class="hljs-number">16</span>) {
                policy = <span class="hljs-string">""</span>;
                wchan = fields[<span class="hljs-number">10</span>];
                pc = fields[<span class="hljs-number">11</span>];
                state = fields[<span class="hljs-number">12</span>];
                name = fields[<span class="hljs-number">13</span>];
                userTime = Integer.parseInt(fields[<span class="hljs-number">14</span>].split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>].replace(<span class="hljs-string">","</span>, <span class="hljs-string">""</span>)) * <span class="hljs-number">1000</span>;
                systemTime = Integer.parseInt(fields[<span class="hljs-number">15</span>].split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>].replace(<span class="hljs-string">")"</span>, <span class="hljs-string">""</span>)) * <span class="hljs-number">1000</span>;
            } <span class="hljs-keyword">else</span> {
                policy = fields[<span class="hljs-number">10</span>];
                wchan = fields[<span class="hljs-number">11</span>];
                pc = fields[<span class="hljs-number">12</span>];
                state = fields[<span class="hljs-number">13</span>];
                name = fields[<span class="hljs-number">14</span>];
                userTime = Integer.parseInt(fields[<span class="hljs-number">15</span>].split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>].replace(<span class="hljs-string">","</span>, <span class="hljs-string">""</span>)) * <span class="hljs-number">1000</span>;
                systemTime = Integer.parseInt(fields[<span class="hljs-number">16</span>].split(<span class="hljs-string">":"</span>)[<span class="hljs-number">1</span>].replace(<span class="hljs-string">")"</span>, <span class="hljs-string">""</span>)) * <span class="hljs-number">1000</span>;
            }
        }

        <span class="hljs-keyword">private</span> <span class="hljs-title">Process</span>(Parcel in) {
            user = in.readString();
            uid = in.readInt();
            pid = in.readInt();
            ppid = in.readInt();
            vsize = in.readLong();
            rss = in.readLong();
            cpu = in.readInt();
            priority = in.readInt();
            niceness = in.readInt();
            realTimePriority = in.readInt();
            schedulingPolicy = in.readInt();
            policy = in.readString();
            wchan = in.readString();
            pc = in.readString();
            state = in.readString();
            name = in.readString();
            userTime = in.readLong();
            systemTime = in.readLong();
        }

        <span class="hljs-keyword">public</span> String <span class="hljs-title">getPackageName</span>() {
            <span class="hljs-keyword">if</span> (!user.matches(APP_ID_PATTERN)) {
                <span class="hljs-comment">// this process is not an application</span>
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
            } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (name.contains(<span class="hljs-string">":"</span>)) {
                <span class="hljs-comment">// background service running in another process than the main app process</span>
                <span class="hljs-keyword">return</span> name.split(<span class="hljs-string">":"</span>)[<span class="hljs-number">0</span>];
            }
            <span class="hljs-keyword">return</span> name;
        }

        <span class="hljs-keyword">public</span> PackageInfo <span class="hljs-title">getPackageInfo</span>(Context context, <span class="hljs-keyword">int</span> flags)
                <span class="hljs-keyword">throws</span> PackageManager.NameNotFoundException
        {
            String packageName = getPackageName();
            <span class="hljs-keyword">if</span> (packageName == <span class="hljs-keyword">null</span>) {
                <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> PackageManager.NameNotFoundException(name + <span class="hljs-string">" is not an application process"</span>);
            }
            <span class="hljs-keyword">return</span> context.getPackageManager().getPackageInfo(packageName, flags);
        }

        <span class="hljs-keyword">public</span> ApplicationInfo <span class="hljs-title">getApplicationInfo</span>(Context context, <span class="hljs-keyword">int</span> flags)
                <span class="hljs-keyword">throws</span> PackageManager.NameNotFoundException
        {
            String packageName = getPackageName();
            <span class="hljs-keyword">if</span> (packageName == <span class="hljs-keyword">null</span>) {
                <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> PackageManager.NameNotFoundException(name + <span class="hljs-string">" is not an application process"</span>);
            }
            <span class="hljs-keyword">return</span> context.getPackageManager().getApplicationInfo(packageName, flags);
        }

        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">describeContents</span>() {
            <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
        }

        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">writeToParcel</span>(Parcel dest, <span class="hljs-keyword">int</span> flags) {
            dest.writeString(user);
            dest.writeInt(uid);
            dest.writeInt(pid);
            dest.writeInt(ppid);
            dest.writeLong(vsize);
            dest.writeLong(rss);
            dest.writeInt(cpu);
            dest.writeInt(priority);
            dest.writeInt(niceness);
            dest.writeInt(realTimePriority);
            dest.writeInt(schedulingPolicy);
            dest.writeString(policy);
            dest.writeString(wchan);
            dest.writeString(pc);
            dest.writeString(state);
            dest.writeString(name);
            dest.writeLong(userTime);
            dest.writeLong(systemTime);
        }

        <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Creator<Process> CREATOR = <span class="hljs-keyword">new</span> Creator<Process>() {

            <span class="hljs-keyword">public</span> Process <span class="hljs-title">createFromParcel</span>(Parcel source) {
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Process(source);
            }

            <span class="hljs-keyword">public</span> Process[] <span class="hljs-title">newArray</span>(<span class="hljs-keyword">int</span> size) {
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> Process[size];
            }
        };
    }

}</code>

通过这个类我们就可以获得运行中的进程了

<code class="hljs php has-numbering"><span class="hljs-comment">//获取运行中进程</span>
 <span class="hljs-keyword">List</span><ProcessManager.Process> runningProcesses = ProcessManager.getRunningProcesses();</code>

但是有很多进程都没有名字,如果你想让用户直观的管理进程的话可能需要下面这个循环过滤没有名字的线程

<code class="hljs avrasm has-numbering"> List<ProcessManager<span class="hljs-preprocessor">.Process</span>> Processes=new ArrayList<>()<span class="hljs-comment">;</span>
 PackageManager pm = getPackageManager()<span class="hljs-comment">;</span>
 runningProcesses = ProcessManager<span class="hljs-preprocessor">.getRunningProcesses</span>()<span class="hljs-comment">;</span>
 for (ProcessManager<span class="hljs-preprocessor">.Process</span> runningProcesse : runningProcesses) {
      String packname = runningProcesse<span class="hljs-preprocessor">.getPackageName</span>()<span class="hljs-comment">;</span>
            try {
                ApplicationInfo applicationInfo = pm<span class="hljs-preprocessor">.getApplicationInfo</span>(packname, <span class="hljs-number">0</span>)<span class="hljs-comment">;</span>
            } catch (PackageManager<span class="hljs-preprocessor">.NameNotFoundException</span> e) {
                e<span class="hljs-preprocessor">.printStackTrace</span>()<span class="hljs-comment">;</span>
                continue<span class="hljs-comment">;</span>
            }
            Processes<span class="hljs-preprocessor">.add</span>(runningProcesse)<span class="hljs-comment">;</span>
        }</code>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Silverlight是由微软开发的一种基于浏览器的应用程序框架。Silverlight 5.1.50918.0是Silverlight的一个特定版本号。每个版本都会带来新的功能和修复现有版本的问题。 Silverlight 5.1.50918.0在2013年9月18日发布,这个版本包含一些重要的新功能和改进。 首先,Silverlight 5.1.50918.0引入了一种称为“平面文本元素”(Text improvements)的新功能,这使得文本在Silverlight应用程序呈现和处理更加高效和高质量。此外,它还提供了XAML文本渲染服务,使开发者能够更好地控制元素的呈现和渲染。 其次,Silverlight 5.1.50918.0还增加了对3D图形和图像处理的支持。它引入了硬件加速的3D图形效果,使开发者能够创建更加逼真和吸引人的用户界面。它还增加了对图像的变形和混合效果的支持,使得开发者能够更灵活地处理和操作图像。 此外,Silverlight 5.1.50918.0还改进了性能和稳定性。它对垃圾回收算法进行了优化,改进了内存管理,从而提升了应用程序的性能和响应能力。它还修复了一些已知的问题和错误,增强了应用程序的稳定性。 总而言之,Silverlight 5.1.50918.0是Silverlight的一个特定版本,它带来了一些新功能和改进,包括平面文本元素、3D图形和图像处理支持,以及性能和稳定性的改进。如果您已安装了Silverlight,建议更新到这个版本以获得更好的体验和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值