android5.1.1通过getRunningServices获取当前运行的pid,进程名等
2016-08-09 17:15
816 查看
今天遇到个怪事,之前项目里面的一个功能:获取Android系统应用的pid以及进程名、包名、APK大小、APK名称、图标,在Android4.2-4.4测试一直没有问题,但是今天在Android5.1.1上面测试竟然只显示应用本身的pid、进程名等···。然后查阅资料才知道原来Google从安全和隐私方面考虑,也废弃了这个方法,现在只能返回自己的应用。获取pid、进程的方法有多种,方法1用getRunningServices,上代码:private
List<RunningAppInfo> queryAllRunningAppInfo() {
pm = UploadAPKFragment.this.getActivity().getPackageManager();
// 查询所有已经安装的应用程序
List<ApplicationInfo> listAppcations = pm
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
Collections.sort(listAppcations,
new ApplicationInfo.DisplayNameComparator(pm));// 排序
// 保存所有正在运行的包名 以及它所在的进程信息
Map<String, ActivityManager.RunningServiceInfo> pgkProcessAppMap = new HashMap<String, ActivityManager.RunningServiceInfo>();
ActivityManager mActivityManager = (ActivityManager) GabelApplication
.getInstance().getSystemService(Context.ACTIVITY_SERVICE);
// 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
List<ActivityManager.RunningServiceInfo> appProcessList = mActivityManager
.getRunningServices(Integer.MAX_VALUE);
for (ActivityManager.RunningServiceInfo appProcess : appProcessList) {
int pid = appProcess.pid; // pid
String processName = appProcess.process; // 进程名
//Log.d("TAG", "processName: " + processName + " pid: " + pid);
String pkgNameList = appProcess.service.getPackageName(); // 获得运行在该进程里的所有应用程序包
//Log.d("TAG", "包名::::"+pkgNameList);
// 输出所有应用程序的包名
pgkProcessAppMap.put(pkgNameList, appProcess);
}
// 保存所有正在运行的应用程序信息
List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 保存过滤查到的AppInfo
for (ApplicationInfo app : listAppcations) {
// 如果该包名存在 则构造一个RunningAppInfo对象
if (pgkProcessAppMap.containsKey(app.packageName)) {
// 获得该packageName的 pid 和 processName
int pid = pgkProcessAppMap.get(app.packageName).pid;
String processName = pgkProcessAppMap.get(app.packageName).process;
runningAppInfos.add(getAppInfo(app, pid, processName));
}
}
return runningAppInfos ;
}
方法2用 UsageStatsManager
In order for this to work, you need
List<RunningAppInfo> queryAllRunningAppInfo() {
pm = UploadAPKFragment.this.getActivity().getPackageManager();
// 查询所有已经安装的应用程序
List<ApplicationInfo> listAppcations = pm
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
Collections.sort(listAppcations,
new ApplicationInfo.DisplayNameComparator(pm));// 排序
// 保存所有正在运行的包名 以及它所在的进程信息
Map<String, ActivityManager.RunningServiceInfo> pgkProcessAppMap = new HashMap<String, ActivityManager.RunningServiceInfo>();
ActivityManager mActivityManager = (ActivityManager) GabelApplication
.getInstance().getSystemService(Context.ACTIVITY_SERVICE);
// 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
List<ActivityManager.RunningServiceInfo> appProcessList = mActivityManager
.getRunningServices(Integer.MAX_VALUE);
for (ActivityManager.RunningServiceInfo appProcess : appProcessList) {
int pid = appProcess.pid; // pid
String processName = appProcess.process; // 进程名
//Log.d("TAG", "processName: " + processName + " pid: " + pid);
String pkgNameList = appProcess.service.getPackageName(); // 获得运行在该进程里的所有应用程序包
//Log.d("TAG", "包名::::"+pkgNameList);
// 输出所有应用程序的包名
pgkProcessAppMap.put(pkgNameList, appProcess);
}
// 保存所有正在运行的应用程序信息
List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 保存过滤查到的AppInfo
for (ApplicationInfo app : listAppcations) {
// 如果该包名存在 则构造一个RunningAppInfo对象
if (pgkProcessAppMap.containsKey(app.packageName)) {
// 获得该packageName的 pid 和 processName
int pid = pgkProcessAppMap.get(app.packageName).pid;
String processName = pgkProcessAppMap.get(app.packageName).process;
runningAppInfos.add(getAppInfo(app, pid, processName));
}
}
return runningAppInfos ;
}
方法2用 UsageStatsManager
UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService(Context.USAGE_STATS_SERVICE); long endTime = System.currentTimeMillis(); long beginTime = endTime - 1000*60; // We get usage stats for the last minute List<UsageStats > stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, beginTime, endTime); // Sort the stats by the last time used if(stats != null) { SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>(); for (UsageStats usageStats : stats) { mySortedMap.put(usageStats.getLastTimeUsed(),usageStats); } if(mySortedMap != null && !mySortedMap.isEmpty()) { topActivity = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); } }
In order for this to work, you need
PACKAGE_USAGE_STATSpermission. You can prompt the user to do this by opening the screen in settings:
Intent usageAccessIntent = new Intent( Settings.ACTION_USAGE_ACCESS_SETTINGS ); usageAccessIntent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK ); startActivity( usageAccessIntent );还有其他几种方法例如:读取android下proc的文件夹获取进程的相关信息等。这是本人第一次写CSDN博客请大家不喜欢的勿喷,我只是当做自己笔记而已。
相关文章推荐
- [Android Pro] 获取手机已经安装的应用 和 获取当前正在运行的所有进程(一个uid对应多个pid)
- Android5.1.+ getRunningAppProcesses()获取运行中进程(第三方开源库)
- [Android Pro] 获取手机已经安装的应用 和 获取当前正在运行的所有进程(一个uid对应多个pid)
- Android5.1.+ getRunningAppProcesses()获取运行中进程(第三方开源库)
- Android5.1.+ getRunningAppProcesses()获取运行中进程(第三方开源库)
- android获取当前设备运行app的进程
- android应用开发—获取当前运行的services列表
- android获取当前正在运行的进程的数目
- 获取当前进程目录 GetCurrentDirectory() 及 获取当前运行模块路径名GetModuleFileName()
- android L 变化之 ActivityManager.getRunningTasks不能获取当前的task列表
- android 获取当前运行进程的名称
- 内存管理[5]通过 GetProcessHeaps 函数获取了当前进程的堆句柄列表
- 获取当前运行Java的进程标识符(PID)
- 通过PID获取进程相关信息,如cmdline
- Android中TASK和PROCESS的区别,获取最近运行的程序和正在运行的进程
- android getLastKnownLocation()获取当前位置为null解决方法
- android, 删除SD卡音乐文件。通过getContentResolver读取音乐文件,可以获取到一个完整的路径,直接new File(这括号写获取的路径).delete();
- android:通过findViewById试图获取界面元素对象为Null,运行会提示空指针异常
- android获取正在运行的进程
- Android中通过GPS或NetWork获取当前位置的经纬度