【问题标题】:One Service communicating with two Activity and another service一个 Service 与两个 Activity 和另一个服务通信
【发布时间】:2011-03-27 15:59:14
【问题描述】:

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

即: Activity A,启动 --> Activity B 和 Service I。

活动 B,启动 --> 服务 II。

此后,活动 A、B 和服务 II 必须与服务 I 通信。 服务 I 总是落后,一旦启动就永远不会停止。

我的做法如下:

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

  2. 创建 Activity A,然后创建 Service I、Activity B;然后从 Activity B 创建 Service II。

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

  4. 当必须使用 initService() 完成通信并在之后不久使用 releaseService() 释放时,每两个类之间都会建立连接。

  5. 在服务 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 学生)。

【问题讨论】:

    标签: android service android-activity bind aidl


    【解决方案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()中,使用intent.getAction()返回一个String,标识调用者。 (使用正确的 .equals() 方法来匹配字符串!)并返回相应的 IBinder

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

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

    【讨论】:

    • 这就是我想知道的,现在我很清楚了。非常感谢。
    【解决方案2】:

    谁能告诉我哪里出错了

    嗯,你问...

    • 您不太可能需要两个 服务,更不可能你 需要一项服务与之通信 另一个,甚至更不可能 您需要绑定一项服务 另一个。

    • 您不太可能需要 AIDL。

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

    • 不要使用 type 属性 Intent 除了 MIME 之外的任何内容 类型。为您希望附加到Intent 的其他数据使用额外的Intent

    • 不要将字符串与= 进行比较,因为 你在你的第三个if() 上面的声明。

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

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

    【讨论】:

    • **抱歉 --> if(intent.getType()="Service_II") 我的意思是 == 而这个 getType()
    • 使用 == 仍然不是在 Java 中比较字符串的方法。您应该使用 equals() 方法。 (谷歌找出原因)
    • @NickT:糟糕,我被所有其他问题所困扰,我忘了指出那个问题。谢谢!
    • @NickT & @CommonsWare:我对此深感遗憾,但我没有复制粘贴实际代码,我使用了 equals() 方法。这是我在 StackOverFlow 上的第一个问题,希望下次能成熟一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多