Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android M:如何获取所有进程UID?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有@L_772_1@应用程序使用 traffic stats API来查看哪些正在运行的进程正在使用网络.

我曾经通过获取通过getRunningAppProcesses()方法获得的uid来做到这一点.显然在Android M中已经更改为仅返回您的应用程序包名称,如here所示.

我的问题是:还有另一种方法获取Android M中每个正在运行的进程的Name和UID吗?

以下是我之前如何做到这一点的示例,我想在Android M上重新创建此功能.

List<RunningAppProcessInfo> procInfos = activitymanager.getRunningAppProcesses();

PackageManager pm = context.getPackageManager();
for (int i = 0; i < procInfos.size(); i++) {
    try {
        String packagename = procInfos.get(i).processName;
        String appName = "";
        try {
            appName = pm.getApplicationLabel(
                    pm.getApplicationInfo(packagename,PackageManager.GET_Meta_DATA))
                        .toString();
        } catch (NameNotFoundException E) {
            appName = "";
        }

        int uid = procInfos.get(i).uid;
        long ulBytes = TrafficStats.getUidTxBytes(uid);
        long dlBytes = TrafficStats.getUidRxBytes(uid);
        // Do other stuff.

非常感谢任何帮助.谢谢!

解决方法

你可以使用 ActivityManager.getRunningServices(int maxNum)

PackageManager pm = context.getPackageManager();
Activitymanager am = (Activitymanager) getSystemservice(Context.ACTIVITY_serviCE);
List<Activitymanager.RunningserviceInfo> runningservices = am.getRunningservices(Integer.max_value);
for (Activitymanager.RunningserviceInfo service : runningservices) {
    String appName;
    try {
        appName = pm.getApplicationInfo(service.process,0).loadLabel(pm).toString();
    } catch (PackageManager.NameNotFoundException E) {
        appName = null;
    }

    int uid = service.uid;

    long ulBytes = TrafficStats.getUidTxBytes(uid);
    long dlBytes = TrafficStats.getUidRxBytes(uid);
}

文档说明这不适用于生产.我也没有做太多测试.如果不符合您的要求,请发表评论.我能想到的另一件事就是在sHell中解析运行ps的输出.

updatE

在sHell中解析ps的输出,我们可以获得当前正在运行的应用程序.例:

PackageManager pm = context.getPackageManager();
// Get the output of running "ps" in a sHell.
// This uses libsuperuser: https://github.com/Chainfire/libsuperuser
// To add this to your project: compile 'eu.chainfire:libsuperuser:1.0.0.+'
List<String> stdout = SHell.SH.run("ps");
List<String> packages = new ArrayList<>();
for (String line : stdout) {
    // Get the process-name. it is the last column.
    String[] arr = line.split("\\s+");
    String processName = arr[arr.length - 1].split(":")[0];
    packages.add(processName);
}

// Get a list of all installed apps on the device.
List<ApplicationInfo> apps = pm.geTinstalledApplications(0);

// Remove apps which are not running.
for (Iterator<ApplicationInfo> it = apps.iterator(); it.hasNext(); ) {
    if (!packages.contains(it.next().packageName)) {
        it.remove();
    }
}

for (ApplicationInfo app : apps) {
    String appName = app.loadLabel(pm).toString();
    int uid = app.uid;
    long ulBytes = TrafficStats.getUidTxBytes(uid);
    long dlBytes = TrafficStats.getUidRxBytes(uid);
    /* do your stuff */
}

大佬总结

以上是大佬教程为你收集整理的Android M:如何获取所有进程UID?全部内容,希望文章能够帮你解决Android M:如何获取所有进程UID?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。