Android AIDL bindService同步问题
大家好!目前正忙于一个项目,需要用到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不是同步执行的?怎么解决???
问题如下:
有两个应用程序安装在同一个手机上,分为客户端(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不是同步执行的?怎么解决???
...全文
相关推荐
安卓AIDL简单详解
**线程同步**:使用AIDL进行跨进程通信时,开发者需要关注线程同步问题,防止出现并发控制错误。**AIDL实例分析**让我们通过一个简单的例子来理解AIDL的使用:1.
Android AMS源码分析之结合AIDL分析bindService
初识AMS(ActivityManagerService) 首先提到AMS(ActivityManagerService)我们先来了解一下Android系统的启动流程,以及AMS是什么时候创建的。 启动到SystemServer这时才会启动一些列的系统服务,其中包括 1.引导服务,例如 ActivityManagerService(AMS)、DeviceIdentifiersPolicyService、 UriGrantsManagerService等 2.核心服务,例如WebViewUpdateS
安卓Android源码——aidl跨进程调用.zip
这个压缩包"安卓Android源码——aidl跨进程调用.zip"很可能是包含了一系列示例代码和讲解,来帮助开发者深入理解如何在Android中使用AIDL进行进程间通信。
安卓aidl的demo,包括自定义类型
**线程模型**: 跨进程调用时,服务端的方法将在单独的线程中执行,因此需要注意线程同步和UI更新的问题。
android server进程通信 AIDL
**五、多线程处理**由于AIDL调用会在新的 Binder 线程中执行,因此服务端处理方法必须做好线程同步,防止并发问题。


