10

我创建了一个 android Service,它扩展了一个AccessibilityService. 从我的Activity,我想绑定到那个Service。因为我需要从 to 发送Service信息Activity。我需要示例代码。我已经搜索了谷歌并没有找到任何类似的东西,请有人可以提供一个示例的链接。

4

2 回答 2

21

虽然可以从 Activity 绑定 AccessibilityService,但您只能将 AccessibilityEvents 传递到服务中。这是因为 AccessibilityService.onBind() 被声明为 final,这意味着您将无法向活页夹添加任何新方法。

但是,有几种替代解决方案。

如果您的活动和服务在同一个进程中运行(如果它们在同一个 APK 中通常是这样),那么您可以与无障碍服务的静态实例进行通信。这是一个如何工作的示例:

MyAccessibilityService.java:

private static MyAccessibilityService sSharedInstance;

protected void onServiceConnected() {
    . . .
    sSharedInstance = this;
}

public boolean onUnbind(Intent intent) {
    sSharedInstance = null;
    . . .
}

public static MyAccessibilityService getSharedInstance() {
    return sSharedInstance;
}

我的活动.java

protected void onCreate() {
    . . .
    mAccessibilityService = MyAccessibilityService.getSharedInstance();
    if (mAccessibilityService != null) {
        // The service is running and connected.
        mAccessibilityService.doSomething();
    }
}

如果您的服务和活动在不同的进程中(例如单独的 APK),那么您仍然有几个选择:

  • 通过将活动中的Intent广播到服务中的 BroadcastReceiver 进行通信
  • 将您的活动绑定到与静态实例通信的 AccessibilityService 进程中的“代理”服务(如上)

如果您需要详细说明其中任何一个,请发表评论。

于 2012-09-24T01:07:54.867 回答
2

也许还有另一种相互交流的方式:

  1. AccessibilityService儿童班:

    处理目标 Activity 的:
    PackageName AND
    ActivityName AND
    specific EventType (eg: AccessibilityEvent.TYPE_VIEW_CLICKED)

    @Override
    public void onAccessibilityEvent(final AccessibilityEvent event)
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
            if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED)
                if (AccessibilityUtils.findNodeInfoByViewTypeAndText(event.getSource(), "android.widget.ToggleButton", TextUtils.getString(R.string.lable_disabled)) != null)
                    getAccessibilityService().disableSelf();
    }  
    
  2. target Activity:just 调用特定的 EventType

    用户调用或
    代码调用

    btnEnableService.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(final View v)
                {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && !btnEnableService.isChecked())
                    {
                        btnEnableService.setChecked(false);
                        txvEnabledState.setText(btnEnableService.isChecked() ? R.string.lable_service_status_enabled : R.string.lable_service_status_closed);
                        AppState.instance().setIsEnable(btnEnableService.isChecked());
                    }
                    else
                    {
                        openAccessibilitySettings();
    
                        btnEnableService.setChecked(!btnEnableService.isChecked());
                    }
                }
            });
    

示例代码:

于 2017-06-08T05:25:48.773 回答