0

所以,这是我的场景:我有两个活动和一个服务——>所有三个(类)都需要另一个服务的返回类型值(所以总共有 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. 在 Service I 中,onBind() 方法必须首先使用 getType() 属性检查意图来自 3 个类中的哪一个,并返回相应的 IBinder 类型。

现在,我的问题出现在第 5 步。其中 onBind() 方法无法执行检查每个意图的 getType() 并给出相应返回类型的操作。这是我的代码,用于服务 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 学生)。

4

2 回答 2

1

在不评论您的整体设计的情况下,我要补充一点,服务区分调用者的方法是使用“动作”属性。我不知道 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()中,使用意图。getAction()返回一个字符串,标识调用者。(使用正确的 .equals() 方法来匹配字符串!)并返回相应的 IBinder

我认为 Intent 上的额外内容不会传递给服务。我从未绑定过其他服务,但我想它可能会起作用。

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

于 2011-03-27T20:09:58.440 回答
0

谁能告诉我我哪里错了

嗯,你问...

  • 您不太可能需要两项服务,更不可能需要一项服务与另一项服务进行通信,更不可能需要一项服务绑定到另一项服务。

  • 您不太可能需要 AIDL。

  • 您不太可能真的需要“总是在后面运行并且一旦启动就永远不会停止”的服务。

  • 不要将typean 的属性 Intent用于 MIME 类型以外的任何内容。对Intent您希望附加到Intent.

  • 不要将字符串与 进行比较=,就像在上面的第三个if() 语句中一样。

  • 不要将代码粘贴到具有明显拼写错误的 StackOverflow 问题中,例如=上面的错误,或者像前两个语句中那样缺少()in 调用。如果它无法编译,那么它就不是一个很好的示例来展示您对情况的理解。getType()if()

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

于 2011-03-27T17:49:46.157 回答