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

Android中如何检测其他应用是否运行?求Android 5.0限制后的替代方案

Android检测其他应用运行状态及5.0+限制下的替代方案

在Android 5.0(API 21)之后,谷歌限制了ActivityManager中获取其他应用运行状态的核心API(比如getRunningTasks()、getRunningAppProcesses()),调用这些方法只能返回当前应用自身的进程/任务信息,无法再获取其他应用的相关数据。下面是几种可行的替代方案:


1. 使用UsageStatsManager API(官方推荐)

这是Android 5.0之后官方提供的合法途径,用于获取应用使用统计数据,包括应用的前台运行状态。

步骤1:添加权限

在AndroidManifest.xml中添加系统保护权限:

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

该权限无法通过常规的requestPermissions()流程获取,必须引导用户到系统设置页面手动开启授权。

步骤2:引导用户开启授权

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);

步骤3:查询应用运行状态

UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
long endTime = System.currentTimeMillis();
long startTime = endTime - 1000 * 60 * 60; // 查询过去1小时的使用数据

List<UsageStats> usageStatsList = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_HOURLY, startTime, endTime);

for (UsageStats usageStats : usageStatsList) {
    // 判断应用是否处于前台:isForeground()从API 23开始可用
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (usageStats.isForeground()) {
            String targetPackage = usageStats.getPackageName();
            // 处理目标应用的前台运行逻辑
        }
    } else {
        // 低版本可通过对比前台使用时间判断
        if (usageStats.getLastTimeForegroundUsage() >= startTime) {
            String targetPackage = usageStats.getPackageName();
            // 处理逻辑
        }
    }
}

2. 利用AccessibilityService监听前台应用

通过辅助服务可以监听系统窗口状态变化,实时获取当前前台显示的应用包名。但该方案需要用户手动开启辅助功能,属于敏感权限,容易被用户拒绝。

步骤1:创建AccessibilityService子类

public class AppMonitorService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // 监听窗口状态变化事件
        if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            String currentPackage = event.getPackageName().toString();
            // 记录当前前台应用包名
        }
    }

    @Override
    public void onInterrupt() {}
}

步骤2:在Manifest中注册服务

<service android:name=".AppMonitorService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService" />
    </intent-filter>
    <meta-data
        android:name="android.accessibilityservice"
        android:resource="@xml/accessibility_config" />
</service>

步骤3:创建accessibility_config.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagDefault"
    android:canRetrieveWindowContent="true"
    android:description="@string/accessibility_desc" />

3. 监听应用相关广播(仅能获取特定事件)

通过注册系统广播,可以监听应用的重启、数据清除、卸载等事件,但无法实时获取应用的运行状态,仅能作为辅助判断手段:

  • ACTION_PACKAGE_RESTARTED:应用重启时触发
  • ACTION_PACKAGE_DATA_CLEARED:应用数据被清除时触发
  • ACTION_PACKAGE_REMOVED:应用卸载时触发

示例广播接收器:

public class AppStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String targetPackage = intent.getData().getSchemeSpecificPart();
        switch (intent.getAction()) {
            case Intent.ACTION_PACKAGE_RESTARTED:
                // 应用已重启
                break;
            case Intent.ACTION_PACKAGE_DATA_CLEARED:
                // 应用数据已清除
                break;
        }
    }
}

4. 针对特定应用的间接判断

如果仅需检测某个特定应用是否可运行,可尝试:

  • 调用PackageManager判断应用是否已安装
  • 尝试发送特定Intent到目标应用的组件,若能成功唤起则说明应用可正常运行(但无法确定是否处于前台)

注意事项

  • 所有方案都需遵守Android隐私政策,必须向用户清晰说明权限用途,避免滥用
  • UsageStatsManager和AccessibilityService都依赖用户主动授权,需在界面上引导用户操作,提升授权意愿

内容的提问来源于stack exchange,提问作者Marek Bil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:43:41