You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java中获取后台运行的应用程序名称?

嘿,我来帮你搞定这个问题!要想用Java获取Android设备后台运行的应用名称(比如你提到的Instagram),得结合Android系统的API来实现,不过不同版本的Android权限规则差别挺大的,我分情况给你讲清楚~

获取Android后台运行应用的Java实现方案

首先明确:Java本身没有跨平台获取设备后台进程的通用API,这个需求是针对Android平台的,需要依赖Android系统提供的接口。

一、Android 9及以下版本(API Level ≤28)

在这些版本中,你可以通过ActivityManager直接获取正在运行的进程列表,步骤如下:

1. 先在AndroidManifest.xml添加权限

<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.REAL_GET_TASKS" />

2. Java代码实现

import android.app.ActivityManager;
import android.content.Context;
import java.util.List;

public class BackgroundAppsHelper {
    public static void getRunningApps(Context context) {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        // 获取正在运行的进程列表
        List<ActivityManager.RunningAppProcessInfo> runningProcesses = activityManager.getRunningAppProcesses();
        
        for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
            // processInfo.processName 是应用包名,比如Instagram的包名是com.instagram.android
            String appPackageName = processInfo.processName;
            // 把包名转换成用户能看懂的应用名称
            String appName = getAppNameFromPackage(context, appPackageName);
            System.out.println("后台应用:" + appName + "(包名:" + appPackageName + ")");
        }
    }

    // 通过包名获取应用名称的辅助方法
    private static String getAppNameFromPackage(Context context, String packageName) {
        try {
            return context.getPackageManager().getApplicationLabel(
                context.getPackageManager().getApplicationInfo(packageName, 0)
            ).toString();
        } catch (Exception e) {
            return packageName; // 获取失败就返回包名
        }
    }
}

二、Android 10及以上版本(API Level ≥29)

从Android 10开始,系统收紧了权限,GET_TASKS和getRunningAppProcesses()只能获取当前自己应用的进程信息。要获取其他应用的后台状态,得用UsageStatsManager,但需要用户手动授权“查看应用使用情况”的权限。

1. 在AndroidManifest.xml添加权限

<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

2. 引导用户授权+获取后台应用

import android.content.Intent;
import android.provider.Settings;
import android.os.Build;
import android.app.usage.UsageStatsManager;
import android.content.Context;
import java.util.List;

public class BackgroundAppsHelper {
    // 检查是否已获取应用使用统计权限
    private static boolean hasUsageStatsPermission(Context context) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            return true;
        }
        UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
        long endTime = System.currentTimeMillis();
        long startTime = endTime - 1000 * 60 * 60 * 24; // 查过去24小时的使用记录
        List<android.app.usage.UsageStats> usageStatsList = usageStatsManager.queryUsageStats(
            UsageStatsManager.INTERVAL_DAILY, startTime, endTime
        );
        return !usageStatsList.isEmpty();
    }

    // 跳转到系统设置页面让用户开启权限
    public static void requestUsageStatsPermission(Context context) {
        Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
        context.startActivity(intent);
    }

    // 获取后台运行的应用(Android 10+)
    public static void getBackgroundAppsAndroid10(Context context) {
        if (!hasUsageStatsPermission(context)) {
            requestUsageStatsPermission(context);
            return;
        }

        UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
        long endTime = System.currentTimeMillis();
        long startTime = endTime - 1000 * 60 * 60 * 24;

        List<android.app.usage.UsageStats> usageStatsList = usageStatsManager.queryUsageStats(
            UsageStatsManager.INTERVAL_DAILY, startTime, endTime
        );

        for (android.app.usage.UsageStats stats : usageStatsList) {
            // 这里简单判断:10秒前使用过的应用视为在后台运行
            if (stats.getLastTimeUsed() < endTime - 1000 * 10) {
                String packageName = stats.getPackageName();
                String appName = getAppNameFromPackage(context, packageName);
                System.out.println("后台应用:" + appName + "(包名:" + packageName + ")");
            }
        }
    }

    private static String getAppNameFromPackage(Context context, String packageName) {
        try {
            return context.getPackageManager().getApplicationLabel(
                context.getPackageManager().getApplicationInfo(packageName, 0)
            ).toString();
        } catch (Exception e) {
            return packageName;
        }
    }
}

几个关键注意点

  • 权限限制:Android 10+对后台进程的访问管控很严,必须用户手动去设置里授权,没法通过代码自动获取。
  • 包名对应:比如Instagram的包名是com.instagram.android,你可以通过这个包名直接判断目标应用是否在后台。
  • 后台定义:如果要判断应用的服务是否在后台运行(不是Activity),Android 9及以下可以结合RunningServiceInfo来补充判断。

内容的提问来源于stack exchange,提问作者Mehmet Ali Aydemir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:33:19