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

时间:2012-05-31 02:06:31

标签: android foreground

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

3 个答案:

答案 0 :(得分:1)

可访问性服务提供了一种获取当前前台服务的方法。

扩展辅助功能服务并创建一个新类。侦听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");
    }
}

要成功实现服务,清单文件还必须在application部分中包含以下声明以及res / xml文件夹中的配置文件

<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>



serviceconfig.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.com/abinpaul1/Android-Snippets/tree/master/GetForegroundService

中提供了示例应用程序以获得前台进程名称的完整代码。

答案 1 :(得分:0)

对于监控其他应用程序,您可以使用ActivityManager获取当前应用程序中的活动堆栈,如您的应用程序:

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();

答案 2 :(得分:0)

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

没有直接的方法来获取应用程序状态的背景或前景,但有可能知道应用程序是前景和背景  有关详细信息:See here