所以,这是我的情景: 我有两项活动和一项服务 - >所有三个(类)都需要来自另一个服务的返回类型值(因此总共2个活动,应用程序中有2个服务)。
即: 活动A,开始 - >活动B和服务I.
活动B,开始 - >服务II。
此后,活动A,B和服务II必须与服务I进行通信。 服务I总是落后,一旦开始就永不停止。
我这样做的方法如下:
编写三个.aidl文件,声明四个通信类之间的接口。
创建活动A,然后创建服务I,活动B;从活动B创建服务II。
作为服务我只能有一个onBind()方法,用于随时与3个类进行通信,我正在做的是通过使用setType()分配不同的值来区分来自3个类的所有意图属性。
当使用initService()进行通信并在使用releaseService()之后不久发布时,每两个类之间建立连接。
在服务I中,onBind()方法必须首先使用getType()属性检查意图来自哪三个类,并返回相应的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学生)。
答案 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
方法的实现中存在错误,这些方法也没有在此处显示。