Android AIDL bindService同步问题

qq357802878 2010-12-21 11:07:27
大家好!目前正忙于一个项目,需要用到AIDL技术,遇到了bindService同步的问题,请教高手帮助解决!
问题如下:
有两个应用程序安装在同一个手机上,分为客户端(Client)和服务端(Server),Client通过AIDL去调用Server中的方法并且获得返回的数据,代码如下:
1.Server端
//IService.aidl
package com.demo.aidl;
interface IService{
boolean appRegist(int appid,in String appName);
}
//RemoteService.java
public class RemoteService extends Service {

@Override
public IBinder onBind(Intent intent) {
return stub;
}

private IService.Stub stub=new Stub() {
@Override
public boolean appRegist(int appid, String appName) throws RemoteException {
//应用程序注册(代码省略),直接返回true
//.....
//.....
return true;
}
};

}

2.Client端
public class ClientActivity extends Activity {

private Button appRegist;
private IService iservice;
private boolean result;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

appRegist=(Button) findViewById(R.id.regist);
appRegist.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("com.demo.aidl.START_SERVICE");
bindService(intent, regConn, BIND_AUTO_CREATE);

//输出注册结果
System.out.println(result);
}
});
}

private ServiceConnection regConn=new ServiceConnection() {

@Override
public void onServiceDisconnected(ComponentName name) {
iservice=null;
}

@Override
public void onServiceConnected(ComponentName name, IBinder service) {
iservice=IService.Stub.asInterface(service);
try {
result=iservice.appRegist(100, "app1");
} catch (RemoteException e) {
e.printStackTrace();
}finally{
unbindService(this);
}
}
};
}

问题是为什么每当第一次点击app regist按钮的时候,输出的结果是false,第一次之后的都是true?
是不是bindService(intent, regConn, BIND_AUTO_CREATE)和ClientActivity不是同步执行的?怎么解决???
...全文
1218 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
SkyGray 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq357802878 的回复:]

引用 2 楼 skygray 的回复:

是的,一般bindService都放在Activity的OnCreate中执行。执行bindService之后并不会立即执行onServiceConnected 这个回调,因此你的result是false


有什么办法确保onServiceConnected执行之后,再将结果返回吗?
[/Quote]
bindService放在 onCreate中是一个,按照设计思想来说,activty就是要在启动后bind一个service,而不是在按了某个按钮。。。
也可另起一个线程 监测iservice 为不为空,不为空就说明onServiceConnected 已经执行成功了
qq357802878 2010-12-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 skygray 的回复:]

是的,一般bindService都放在Activity的OnCreate中执行。执行bindService之后并不会立即执行onServiceConnected 这个回调,因此你的result是false
[/Quote]

有什么办法确保onServiceConnected执行之后,再将结果返回吗?
SkyGray 2010-12-21
  • 打赏
  • 举报
回复
是的,一般bindService都放在Activity的OnCreate中执行。执行bindService之后并不会立即执行onServiceConnected 这个回调,因此你的result是false
qq357802878 2010-12-21
  • 打赏
  • 举报
回复
补充一下,调试发现,第一次点击注册没有绑定成功,只执行了RemoteService的onCreate方法,onBind方法并未执行

第一次执行为什么没绑定成功呢???
bigpretty 2010-12-21
  • 打赏
  • 举报
回复
我感觉应该设置一个监听,成功了返回后才执行下面的动作

80,472

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧