如何获取前台的活动窗口?

时间:2014-05-06 20:31:41

标签: java android service android-activity window

我的Q很简单。

我无法从我的服务中找到修改当前活动窗口属性的方法。 我在堆栈上看到了一些线程,也在其他地方,但它们都没有真正回答。 前台(活动)活动可以是任何东西。我无法访问它。

这家伙似乎问同样的问题,没有A ...... How to get the foreground activity instance?

提前许多人!

2 个答案:

答案 0 :(得分:0)

不幸的是Android似乎不支持这样的需求,修改顶级应用程序的窗口,从后台运行的服务。

我发现这是最合适的做法:

http://developer.android.com/guide/components/services.html

” 向用户发送通知 运行后,服务可以使用Toast Notifications或状态栏通知向用户通知事件。

Toast通知是当前窗口表面上显示的消息,然后消失,而状态栏通知在状态栏中提供一条消息,用户可以选择该消息以获取行动(例如开始活动)。

通常,状态栏通知是完成某些后台工作(例如文件已完成下载)并且用户现在可以对其进行操作时的最佳技术。当用户从展开视图中选择通知时,通知可以启动活动(例如查看下载的文件)。

有关详细信息,请参阅Toast Notifications或状态栏通知开发人员指南。“

答案 1 :(得分:0)

可访问性服务提供了一种与foregroung服务进行交互的方式。这有点像解决方法,但仍然有效。

要使用此功能,请扩展辅助功能服务并创建一个新类。侦听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());

            // Check PackageName matching here and continue with code
            // Here we prevent whatsapp from opening
            // Each time it launches we simulate the press of back button
            if (accessibilityEvent.getPackageName().equals("com.whatsapp")){
                doAction();
            }

        }

    }

    @Override
    public void onInterrupt() {

    }

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

    public void doAction(){
        performGlobalAction(GLOBAL_ACTION_BACK);
    }
}

在这里,我检查前台服务是否是Whatsapp,然后继续检查我的代码。

除此类外,还必须在应用程序部分的清单文件中声明此服务,并在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

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