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>