我正在尝试通过AccessibilityService
发送系统返回按键事件,这个方法可以正常工作,但只有在我不在自己的应用程序中才有效。
无论我是否在自己的应用程序中,我总是从performGlobalAction
得到true
,但只有当我不在自己的应用程序中而在其他任何一个应用程序中时(例如显示上一个活动或类似情况),我才能看到事件真正被执行。
有什么想法是为什么会发生这种情况吗?我的应用程序是一个侧边栏应用程序,在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.xml
中设置了所有AccessibilityService
的内容,并使用它来定义我的服务设置,这也非常好地工作,我想要接收的所有事件都能够可靠地和正确地接收到
编辑2
看起来在我的情况下,我的覆盖层仍然会窃取焦点,使其可以聚焦,而且有时会出现时间问题。不过,我的解决方案可以通过使用BroadcastReceiver
来改进,因为如已接受的答案所讨论的那样,startService
调用是不安全的。