android5.1.1通过getRunningServices获取当前运行的pid,进程名等

今天遇到个怪事,之前项目里面的一个功能:获取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博客请大家不喜欢的勿喷,我只是当做自己笔记而已。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值