Android L 之后Google收紧了权限的控制 .
这时我们可以尝试通过ps命令来获取后台运行的进程
private static String getRunningApk() { long startTime = System.currentTimeMillis(); String pgkProcessAppMap = ""; Set<String> rProcess = new HashSet<String>(); String cmd = "ps"; try { java.lang.Process p = Runtime.getRuntime().exec(cmd); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = null; int index = 0; while ((line = in.readLine()) != null) { if (index > 0) { StringTokenizer st = new StringTokenizer(line); int lenght = st.countTokens(); if (lenght > 0) { String uid = st.nextToken();//0 index USER if (uid.startsWith("u0_") ) { String processInfo = ""; for (int i = 0; i < (lenght - 1); i++) { if (!(i == (lenght - 2))) { st.nextToken(); } else { processInfo = st.nextToken(); } } if (!TextUtils.isEmpty(processInfo)) { if (processInfo.contains(":")) { String a[] = processInfo.split(":"); rProcess.add(a[0]); } else { rProcess.add(processInfo); } } } } } index++; } } catch (IOException e) { Log.logE("getRunningApk err="+e.toString()); } for(String pro : rProcess){ pgkProcessAppMap += pro + ","; } if (pgkProcessAppMap.contains(",") && pgkProcessAppMap.length() > 0 ) { pgkProcessAppMap = pgkProcessAppMap.substring(0, pgkProcessAppMap.length()-1); } long endTime = System.currentTimeMillis(); Log.logE("do_exec pgkProcessAppMap = " + pgkProcessAppMap + "\t time = " + (endTime - startTime)); return pgkProcessAppMap; }
google发现API 21 新增的接口 android.app.usage , 这个 API 比已弃用的 getRecentTasks( ) 方法提供了更详细信息
@TargetApi(21) public static String getTopPackageNameFor21(Context mContext) { String topPackageName = ""; android.app.usage.UsageStatsManager usm = (android.app.usage.UsageStatsManager) mContext.getSystemService("usagestats"); Calendar calendar = Calendar.getInstance(); long endTime = calendar.getTimeInMillis(); long startTime = calendar.getTimeInMillis() - 60*1000; //Log.logD(" Range start:" + dateFormat.format(startTime) ); //Log.logD(" Range end:" + dateFormat.format(endTime)); android.app.usage.UsageEvents uEvents = usm.queryEvents(startTime,endTime); while (uEvents.hasNextEvent()){ android.app.usage.UsageEvents.Event e = new android.app.usage.UsageEvents.Event(); uEvents.getNextEvent(e); if (e != null){ //Log.logE(" Event: " + dateFormat.format(e.getTimeStamp()) + "::" + e.getPackageName()); topPackageName = e.getPackageName(); } } return topPackageName; }
注: 必须要在manifest中申明权限
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
The End!
Anyway,小编第一次这上面写文章,总有发表一下感言的,哈哈。虽然网络上以已经有很多类似的啦,不过小编还是写了一下,不为别的,就是给自己补补脑。Bye~