如何监控应用在前台的切换?

问题描述 投票:2回答:3

当我的应用程序在后台运行时,需要监控其他应用程序在前台的切换,并获取它们的名称。我的应用程序在后台运行时,需要监控其他应用程序在前台的切换,并获取它们的名称。即当一个应用进入前台时,必须通知我的应用,然后获取它的名字。我的应用必须得到通知,然后获取它的名字。

android foreground
3个回答
0
投票

对于监控其他应用程序,你可以使用 活动管理器 用于获取活动栈的当前前台申请,如您的申请。

ActivityManager am = (ActivityManager)context.getSystemService(Context. ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> processes1 = activityManager.getRunningTasks(1);
ComponentName componentInfo = processes1.get(0).topActivity;
String classname =processes1.get(0).topActivity.getClassName(); 
String packagename = processes1.get(0).topActivity.getPackageName();

1
投票

无障碍服务提供了一种获取当前前台服务的方法。扩展Accessibility Service并创建一个新的类。监听 AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 事件。每当前台活动发生变化时,该事件就会被触发。与回调一起传递的事件对象包含前台应用程序的包名。

AccessibilityService.java

public class AccessibilityService extends android.accessibilityservice.AccessibilityService{
    public static AccessibilityService instance;
    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        // Note : This event is sometimes called more than one for a foreground service
        if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
            Log.d("Event","TYPE_WINDOW_STATE_CHANGED");
            Log.d("Pkg",accessibilityEvent.getPackageName().toString());
        }
    }

    @Override
    public void onInterrupt() {

    }

    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        Log.d("Accessibility","Service Connected");
    }
}

为了成功地实现服务,清单文件还必须在应用程序部分包含以下声明,以及resxml文件夹中的配置文件。

<service android:name=".AccessibilityService"
            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/serviceconfig"/>
</service>

服务配置.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackAllMask"
    android:accessibilityFlags="flagDefault"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"
    />

确保用户授予访问服务权限。这需要用户手动启用。获取前台进程名称的示例应用程序的完整代码可在以下网址获得。https:/github.comabinpaul1Android-SnippetstreemasterGetForegroundService。


0
投票

我们不能使用getRunningTasks,因为android规定 "该方法只用于调试和展示任务管理用户界面"。

没有直接的方法来获取应用程序在后台或前台的状态,但是有可能知道应用程序在前台和后台的状态。请看这里

© www.soinside.com 2019 - 2024. All rights reserved.