如何让活动窗口在前景上?

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

我的问题是非常直接的,我不知道如何从我的服务中修改当前活动窗口的属性。

我不知道如何从我的服务中修改当前活动窗口的属性.我在堆栈上看到了一些帖子,也在其他地方看到了,但没有一个真正的答案.前台(活动)活动可以是任何东西。我无权访问它。

这个家伙似乎问了同样的问题,但没有得到答案......如何获得前台活动实例?

Many thanx in advance !

java android service android-activity window
2个回答
0
投票

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

我发现这是目前最好的办法。

http:/developer.android.comguidecomponentsservices.html。

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

吐司通知是指在当前窗口表面出现片刻然后消失的消息,而状态栏通知则是在状态栏中提供了一个带有消息的图标,用户可以选择该图标来进行操作(如启动活动)。

通常,当一些后台工作已经完成(如一个文件完成下载),用户现在可以采取行动时,状态栏通知是最好的技术。当用户从展开的视图中选择通知时,通知可以开始一个活动(如查看下载的文件)。

更多信息请参见Toast通知或状态栏通知开发者指南。"


0
投票

可访问性服务提供了一种与前台服务交互的手段。这有点像一种变通方法,但仍然有效。 要利用这一点,扩展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());

            // 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,如果是的话再继续我的代码。

除了这个类,这个服务还必须在应用部分的manifest文件中声明,同时在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。

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