Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在前台监控应用程序交换?_Android_Foreground - Fatal编程技术网

Android 如何在前台监控应用程序交换?

Android 如何在前台监控应用程序交换?,android,foreground,Android,Foreground,当我的应用程序在后台运行时。它需要在前台监视其他应用程序交换,并获取它们的名称。如何实施? i、 e.当应用程序转到前台时。必须通知我的应用程序。然后获取其名称。用于监视其他应用程序,您可以使用这些应用程序获取活动堆栈的当前顶级应用程序,如您的应用程序: ActivityManager am = (ActivityManager)context.getSystemService(Context. ACTIVITY_SERVICE); List<ActivityManager.Running

当我的应用程序在后台运行时。它需要在前台监视其他应用程序交换,并获取它们的名称。如何实施?
i、 e.当应用程序转到前台时。必须通知我的应用程序。然后获取其名称。

用于监视其他应用程序,您可以使用这些应用程序获取活动堆栈的当前顶级应用程序,如您的应用程序:

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();
ActivityManager am=(ActivityManager)context.getSystemService(context.ACTIVITY_服务);
列表进程1=activityManager.getRunningTasks(1);
ComponentName componentInfo=processes1.get(0.topActivity);
字符串classname=processes1.get(0.topActivity.getClassName();
字符串packagename=processes1.get(0.topActivity.getPackageName();

我们不能使用getRunningTasks,因为android指定“该方法仅用于调试和显示任务管理用户界面”

在后台或前台时,没有直接的方法获取应用程序状态,但有可能知道应用程序何时为前台和后台
有关更多详细信息:

辅助功能服务提供了获取当前前台服务的方法。

扩展可访问性服务并创建一个新类。侦听AccessibilityEvent.TYPE\u WINDOW\u STATE\u 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");
    }
}
要成功实现该服务,清单文件还必须在应用程序部分包含以下声明,并在res/xml文件夹中包含一个配置文件



谢谢你的回复。要注册哪个广播消息?你只需要在清单中添加android.permission.GET_TASKS权限,并创建一个使用ActivityManager观看活动堆栈的服务。对不起,我仍然不明白。我应该每秒运行上述代码吗?如何接收事件?是的,因为我知道只有ActivityManager是c的一种方式检查您的应用程序是否正在与用户交互。您需要每秒在后台运行您的服务,但这是一项耗电任务,因此请在屏幕锁定后用户使用手机时启动服务,并在屏幕关闭时使用屏幕关闭接收器停止此操作是的,我找不到其他应用程序是的,也许这是最好的。
<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 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"
    />