Как вызвать метод AccessibilityService из другой службы?

Я пытаюсь вызвать метод, присутствующий в классе, который расширяет AccessibilityService из другого класса, который расширяет Service следующим образом:

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

но ничего не происходит, уже если это вызывается внутри MyAccessibility (класс AccessibilityService) все работает нормально.

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 не может быть.


person Community    schedule 19.08.2018    source источник


Ответы (3)


Решение - доступ 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();
person Community    schedule 20.08.2018
comment
Хотя это решение приведет к запуску кода для doAction, он не будет работать так, как вы ожидаете. А именно, в контексте AccessibilityService, с полными привилегиями, которые это влечет за собой. - person ChrisCM; 22.08.2018
comment
@ChrisCM, мне нужно позвонить doAction(); вне класса AccessibilityService. Мой проект требует этого, и это было решением моей проблемы. - person ; 22.08.2018
comment
Это очень хрупкая вещь, которую вы делаете, если она работает в этом случае, круто, но она уже не удалась для одного пользователя: stackoverflow.com/questions/46194538/ - person ChrisCM; 22.08.2018

Вы не можете. Хотя предоставленные ответы вызовут запуск кода, он наверняка не будет работать так, как вы ожидаете. AccessibilityServices не такие, как обычные Services. Они получают повышенные привилегии. Чтобы получить эти повышенные привилегии, они должны быть запущены в их собственном специальном Context, и единственный способ получить это состояние — запустить службу из меню настроек AccessibilityServices... Где TalkBack.

ВЫ МОЖЕТЕ... вы не должны... но ВЫ МОЖЕТЕ запустить свою службу и использовать механизмы внутрипроцессного взаимодействия, чтобы запустить функцию, когда вы хотите, из другого процесса. Это был бы единственный способ добиться того, чего вы хотите с функциональной точки зрения.

person ChrisCM    schedule 21.08.2018

Я думаю, нам нужно сделать намерение вызвать службу, тогда она будет работать как служба.

Намерение намерение = новое намерение (это, HelloService.class); startService(намерение);

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

Если мы хотим вызвать именно этот метод, то скопируем этот метод в обычный класс и вызовем его.

person Meep    schedule 19.08.2018
comment
служба уже была запущена ровно startService();. - person ; 20.08.2018
comment
If we want to call this method specifically, then copy this method to a regular class and call it.. Этого не может быть, т.к. пропал доступ к конкретным методам типа performGlobalAction(); - person ; 20.08.2018
comment
вы вызываете метод из потока пользовательского интерфейса? Служба выполняется в фоновом потоке. - person Meep; 20.08.2018
comment
из фоновой службы в: class CMDThread implements Runnable { - person ; 20.08.2018
comment
CMDThread вызывает службу MyAccessibility — вы видите System.out.println (доступность была подключена!); выход? - person Meep; 20.08.2018
comment
Служба MyAccessibility запускается в onCreate(). MainActivity. MainActivity также запускает мою фоновую службу SocketBackgroundService, где содержится CMDThread, который выполняется при успешном подключении Socket. Затем CMD Thread будет ждать некоторой команды от серверного приложения. Затем, если я отправлю команду, например, показать последние приложения, тогда: MyAccessibility access = new MyAccessibility(); access.doAction(); как я показал выше по вопросу. Но ничего не происходит. - person ; 20.08.2018
comment
Является ли MyAccessibility одноразовой операцией? Если это так, то мы можем воссоздать MyAccessibility в потоке CMD и запустить его. Затем MyAccessibility запустит doAction(). Если вы хотите получить doAction() только без вызова службы. Я думаю, что MyAccessibility должен быть запущен, чтобы функция PerformGlobalAction() работала. Попробуйте добавить system.out.print(что-то) в doAction(), чтобы посмотреть, появится оно или нет. - person Meep; 20.08.2018
comment
performGlobalAction(); ложно, приходит system.out.print("something"). Тогда проблема с performGlobalAction();. - person ; 20.08.2018
comment
Я думаю, что executeGlobalAction(); будет работать, если служба включена. Проверьте, включена служба или нет. проверьте stackoverflow.com/questions/29200046/ - person Meep; 20.08.2018
comment
спасибо за помощь, я нашел возможное решение. Смотрите мой ответ. - person ; 20.08.2018