如何从另一个服务调用 AccessibilityService 方法?

How call a AccessibilityService method from another service?

我正在尝试调用 class 中存在的方法,该方法从另一个 class 扩展 AccessibilityService,以这种方式扩展 Service

MyAccessibility access = new MyAccessibility();
access.doAction(); // doAction(); is the method called

但是没有任何反应,如果在 MyAccessibility (AccessibilityService class) 中调用它,一切正常。

public class MyAccessibility extends AccessibilityService {

@Override
    protected void onServiceConnected() {
        super.onServiceConnected();

        System.out.println("Accessibility was connected!");

        doAction();
    }

    public void doAction(){

    performGlobalAction(GLOBAL_ACTION_RECENTS);

    }

}

那么我如何从另一个服务调用 MyAccessibility 的任何方法?


编辑:

我也试过把doAction()改成static,但是performGlobalAction不行。

我认为我们需要调用该服务,然后它就会像服务一样执行。

Intent intent = new Intent(this, HelloService.class); 启动服务(意图);

https://developer.android.com/guide/components/services

如果我们要具体调用这个方法,那么把这个方法复制到一个正则class中去调用。

解决方案是通过单例访问MyAccessibility

public class MyAccessibility extends AccessibilityService {

public static MyAccessibility instance;

@Override
    protected void onServiceConnected() {
        super.onServiceConnected();

        System.out.println("Accessibility was connected!");

        instance = this;

    }

    public void doAction(){

    performGlobalAction(GLOBAL_ACTION_RECENTS);

    }

}

然后像这样从您的服务中调用 doAction();

MyAccessibility.instance.doAction();

你不能。虽然提供的答案会使代码成为 运行,但它肯定不会像您期望的那样 运行。 AccessibilityServices 不像正常的 Services。他们获得更高的特权。为了获得这些提升的特权,他们必须 运行 在他们自己的特殊 Context 中,获得该状态的唯一方法是从 AccessibilityServices 设置菜单启动服务...TalkBack 所在的位置。

您可以...您不应该...但您可以启动您的服务并使用进程内通信机制在您希望从另一个进程获取功能时将其获取到 运行。从功能的角度来看,这将是实现您想要的唯一方法。