Java 如何获取位于前景的活动窗口?

Java 如何获取位于前景的活动窗口?,java,android,service,android-activity,window,Java,Android,Service,Android Activity,Window,我的问题很简单 我无法从我的服务中找到修改当前活动窗口属性的方法。 我在堆栈上看到了一些线程,在其他地方也看到了,但它们都没有真正的答案。 前台(活动)活动可以是任何内容。我没有办法得到它 这家伙似乎问同样的问题,没有得到一个。。。 提前很多次 不幸的是,安卓似乎不支持这样的需求,从后台运行的服务中修改顶级应用的窗口 我发现这是迄今为止最合适的做法: " 向用户发送通知 一旦运行,服务可以使用Toast通知或状态栏通知通知用户事件 toast通知是一条出现在当前窗口表面的消息,该消息会出现一

我的问题很简单

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

这家伙似乎问同样的问题,没有得到一个。。。


提前很多次

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

我发现这是迄今为止最合适的做法:

" 向用户发送通知 一旦运行,服务可以使用Toast通知或状态栏通知通知用户事件

toast通知是一条出现在当前窗口表面的消息,该消息会出现一段时间然后消失,而状态栏通知会在状态栏中提供一个带有消息的图标,用户可以选择该图标以执行操作(例如启动活动)

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


有关更多信息,请参阅Toast通知或状态栏通知开发者指南。“

辅助功能服务提供了与foregroung服务交互的方法。这有点像一种变通方法,但仍然有效。

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

            // 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文件夹中声明一个配置文件



您需要在每个活动中单独注册一个广播接收器,以便它可以接收您服务的更新。可能重复:谢谢您的回答。不幸的是,这不是我需要的。我想根据我的服务中发生的事件调暗显示。好吧,我只能通过修改前台应用程序窗口的属性来实现这一点。有什么解决办法吗?是的,我不能在这些活动中注册BCast接收器,因为它们可以是任何东西,但不是我的:)
<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"
    />