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

时间:2011-03-27 15:59:14

标签: android service android-activity bind aidl

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

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

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

此后,活动A,B和服务II必须与服务I进行通信。 服务I总是落后,一旦开始就永不停止。

我这样做的方法如下:

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

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

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

  4. 当使用initService()进行通信并在使用releaseService()之后不久发布时,每两个类之间建立连接。

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

  6. 现在, 我的问题是在第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 :(得分:1)

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

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

或.ACTION_2或.ACTION_3。

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

<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 :(得分:0)

  

谁能告诉我哪里出错了

嗯,你问......

  • 你不太可能需要两个 服务,甚至你不太可能 需要一个服务来与之沟通 另一个,甚至不太可能 你需要一个服务来绑定 另一

  • 您不太可能需要 AIDL。

  • 你真的不太可能 需要“始终如一的服务” 在后面跑,永不停止一次 开始”。

  • 不要使用的type属性 Intent用于除MIME之外的任何内容 类型。对Intent附加的其他数据使用Intent附加费。

  • 请勿将字符串与=进行比较 你是第三个if() 上面的陈述。

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

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