Я пытаюсь отправить системное событие возврата через AccessibilityService
, и это работает нормально, но только если я не в своем собственном приложении.
Я всегда получаю true
от performGlobalAction
независимо от того, нахожусь я в собственном приложении или нет, но я вижу, что событие действительно выполняется, только если я не нахожусь в своем собственном приложении, а в любом другом (в смысле что отображается предыдущее действие или подобное)
Есть идеи, почему это происходит? Мое приложение представляет собой приложение боковой панели с оверлеем, нарисованным сверху в WindowManager
, и все работает (AccessibilityService
запущен и обрабатывает мои пользовательские события, и служба всегда возвращает сообщения об успешном завершении моих событий, но мое собственное приложение не реагирует на обратную связь событие кнопки).
Мой сервис выглядит следующим образом:
public class MyAccessibilityService extends AccessibilityService {
public static void sendBackIntent(Context context) {
Intent intent = new Intent(context, MyAccessibilityService.class);
intent.putExtra("action", GLOBAL_ACTION_BACK);
context.startService(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Bundle extras = intent.getExtras();
Integer action = null;
if (extras != null) {
action = extras.getInt("action");
}
if (action != null) {
switch (action) {
case GLOBAL_ACTION_BACK:
boolean result = performGlobalAction(action);
L.d("Action %d executed: %b", action, result);
break;
default:
L.e("Unhandled action %d", action);
break;
}
}
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
}
@Override
public void onInterrupt() {
}
}
Изменить
Чтобы прояснить это:
- Я НЕ запускаю эту службу через
MyAccessibilityService.sendBackIntent(context)
, я отправляю следующее намерение:if (isAccessibilityserviceRunning) MyAccessibilityService.sendBackIntent(context)
- Я запускаю свой сервис через системное сервисное меню, просто включив его там, а затем позволяю системе запускать его автоматически.
- Я настроил все для
AccessibilityService
вaccessibilityservice.xml
и использую это для определения настроек моих служб, и это тоже работает отлично, все события, которые я хочу получать, принимаются надежно и правильно
ИЗМЕНИТЬ 2
Похоже, что в моем случае мой оверлей все еще крадет фокус, делая его настраиваемым и не имеет проблем с синхронизацией, которые иногда создают проблемы. Тем не менее, мое решение можно улучшить, используя BroadcastReceiver
для связи со службой, поскольку вызов startService
небезопасен, как описано в принятом ответе.