首页 文章

一个服务与两个Activity和另一个服务进行通信

提问于
浏览
0

所以,这是我的场景:我有两个活动和一个服务 - >所有三个(类)需要来自另一个服务的返回类型值(因此总共2个活动,应用程序中的2个服务) .

即:活动A,开始 - >活动B和服务I.

活动B,开始 - >服务II .

此后,活动A,B和服务II必须与服务I进行通信 . 服务I始终在后面运行,一旦启动就永不停止 .

我这样做的方法如下:

  • 编写三个.aidl文件,声明四个通信类之间的接口 .

  • 创建活动A,然后创建服务I,活动B;从活动B创建服务II .

  • 作为服务我只能有一个onBind()方法,用于随时与3个类进行通信,我正在做的是通过使用setType()属性分配不同的值来区分来自3个类的所有意图 .

  • 当必须使用initService()进行通信并在使用releaseService()之后不久发布时,在每两个类之间 Build 连接 .

  • 在服务I中,onBind()方法必须首先使用getType()属性检查意图来自哪3个类,并返回相应的IBinder类型 .

现在,我的问题是在第5步,其中onBind()方法不能执行检查每个意图的getType()的操作,并给出相应的返回类型 . 这是我的代码,对于Service I中的onBinder()方法:

@Override
public IBinder onBind(final Intent intent){
    Log.d(Main_Service.TAG,"it got connected");
    if(intent.getType=="Activity_A")
    {
        return new Activity_A_aidl.Stub() {
            public void function1(int u1,String p1,String p2) throws RemoteException{
                //do something
            }
        };}

    if(intent.getType=="Activity_B"){
        return new Activity_B_aidl.Stub() {
            public int function2() throws RemoteException{//do something
                return some_integer_values;
            }
        };} 
    if(intent.getType()="Service_II"){
        return new Service_II_aidl.Stub(){
            public boolean function3(String u,String p) throws RemoteException{
                //do something

            return boolean_type_variable;
            }
        };}
}

错误:如LogCat中所示:java.lang.NullPointerException

来自所有3个类(活动A,B和服务II),其中我正在调用try-catch块中的一个函数 .

谁能告诉我哪里出错了 .

-Kishore Debnath,(3年级,CSE学生) .

2 回答

  • 0

    在没有评论您的整体设计的情况下,我想补充说服务区分呼叫者的方式是使用'action'属性 . 我不知道initService()是什么,但是当我绑定到远程服务时,我只使用bindService() . 所以在你的活动中有类似的东西:

    bindService(new Intent("com.mypackage.myService.ACTION_1"), this,
                    Context.BIND_AUTO_CREATE);
    

    或.ACTION_2或.ACTION_3 .

    然后在您的服务清单中有一个intent过滤器:

    <intent-filter>
       <action  android:name="com.mypackage.myService.ACTION_1" />
       <action  android:name="com.mypackage.myService.ACTION_2" />
       <action  android:name="com.mypackage.myService.ACTION_3" />
    </intent-filter>
    

    然后在服务的 onBind() 中,使用intent . getAction() 返回一个String,标识调用者 . (使用正确的.equals()方法匹配String!)并返回相应的IBinder

    我不认为Intent上的额外内容会传递给服务 . 我从来没有打算从其他服务服务,但我想它可能会工作 .

    最后一点,我只使用AIDL和远程服务,因为出于商业原因,我需要在两个单独的.apks之间拆分功能 . 我没有很好的技术理由使用它,实际上恰恰相反 .

  • 1

    谁能告诉我哪里出错了

    好吧,你问......

    • 您不太可能需要两个服务,甚至不太可能需要一个服务与另一个服务进行通信,甚至不太可能需要一个服务绑定到另一个服务 .

    • 您不太可能需要AIDL .

    • 你真的不太需要一个“总是在后面跑,一旦开始就永不停止”的服务 .

    • 不要将 Intenttype 属性用于MIME类型以外的任何内容 . 对于希望附加到 Intent 的其他数据,请使用 Intent 额外信息 .

    • 不要将字符串与 = 进行比较,因为您在上面的第三个 if() 语句中 .

    • 不要将代码粘贴到具有明显拼写错误的StackOverflow问题中,例如上面的 = ,或者在前两个 if() 语句中缺少对 getType() 的调用中的 () . 如果它不能编译,那么证明您对情况的理解不是一个好的样本 .

    您的实际问题很可能来自此处未显示的代码 . 您可能尝试在绑定连接之前调用 Binder 对象上的方法(例如,在调用 onServiceConnected() 之前) . 或者,您可能只是在 Binder 方法的实现中有错误,您也没有在这里显示 .

相关问题