Android5.1.+ getRunningAppProcesses()獲取執行中程序(第三方開源庫)
阿新 • • 發佈:2019-02-04
google可能為了安全考慮,在5.1.+後呼叫activitymanager.getRunningAppProcesses()方法只能返回你自己應用的程序,那如何在5.1.+後獲取執行中程序呢?一個大神stackoverflow給出了答案(點選跳轉)。如果你能熟練的匯入第三方庫,那麼相信你可以不用向下看了,如果你選擇向下看,那我會用白話文教你一步步實現。首先到這位答主的github上下載他上傳的開源庫,梯子自備(點選跳轉)。沒有梯子可以到我的個人百度雲下載:連結:
http://pan.baidu.com/s/1kVjjPsF 密碼: ag6u
下載完成後解壓目錄結構
我們只需要其中的紅線框住的部分,但是直接匯入,肯定會處很多的問題,我們先來處理一部分,開啟libsuperuser
修改完成後來到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>