您的位置:首页 > 移动开发 > Android开发

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

 

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_STATS
 permission. 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 apk 应用
相关文章推荐