从已经绑定的服务中返回另一个Binder

时间:2019-04-11 08:07:39

标签: android service ipc aidl android-binder

我有一个已经通过AIDL与外部应用程序绑定的服务。

但是,有些服务请求需要启动Activity。 由于我无法从服务内致电startActivityForResult,因此决定将本地活动也绑定到该服务。

(PseudoCode)看起来像这样:

class MyService extends Service{
    public IBinder onBind(Intent intent){
        if (intent.hasExtra("LocalBindingRequest")){
            return getLocalBinder();
        else {
           return getAidlBinder();
        }
    }
}

class ExternalApp extends Activity{
    void someFunc(){
        Intent i = new Intent(new ComponentName("com.my.pkg", "com.my.pkg.MyService");
        bindService(i, myServiceConnection, Context.BIND_AUTO_CREATE);
    }
}

class InternalApp extends Activity{
    MyService mService;

    void someFunc(){
        Intent i = new Intent(new ComponentName("com.my.pkg", "com.my.pkg.MyService")
           .putExtra("LocalBindingRequest", true);
        bindService(i, myServiceConnection, Context.BIND_AUTO_CREATE);
    }

    public void onServiceConnected(ComponentName cn, IBinder service){
        InternalBinder ib = (LocalBinder)service;
        mService = ib.getService();

    }
}

流是这样的:

  • ExternalApp绑定到AidlBinder
  • ExternalApp调用需要服务才能启动活动的功能
  • 服务开始活动
  • 内部活动试图绑定
  • 我得到一个异常(显然没有在onBindonServiceConnected中达到断点)
  

java.lan.ClassCastException:AidlService无法强制转换为InternalBinder


服务是否有可能返回其他活页夹?

如果没有,该怎么做,将结果传播回已绑定的MyService?

1 个答案:

答案 0 :(得分:0)

好吧,我应该阅读let view model dispatch = div [ Class "main-container" ] [ input [ Class "input" Value model.Value OnChange (fun ev -> ev.target?value |> string |> ChangeValue |> dispatch) ] span [ ] [ str "Hello, " str model.Value str "!" ]; str "Goodbye!" ] 中的文档

  

Intent:用于绑定到此服务的Intent,如   Context.bindService。请注意,   此时的意图不会在这里显示。

这就是为什么我得到了Aidl服务。解决方法是:

onBind(Intent)

我们可以为每个绑定请求使用单独的绑定器