1. 我们先来看一个与本地service通信的例子。

public class LocalService extends Service {  

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

public void sayHelloWorld(){
Toast.makeText(this.getApplicationContext(), "Hello World Local Service!", Toast.LENGTH_SHORT).show();
}

public class LocalBinder extends Binder {
LocalService getService() {
// Return this instance of LocalService so clients can call public methods
return LocalService.this;
}
}
}



local servcie 的代码如上,在onBinder方法中返回binder,binder包含了service的句柄,客户端得到句柄以后就可以调用servcie的公共方法了,这种调用方式是最常见的。

public class LocalServiceTestActivity extends Activity {  
static final String TAG = "LocalBinderTestActivity";
ServiceConnection mSc;

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

mSc = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "service connected");
LocalService ss = ((LocalBinder)service).getService();
ss.sayHelloWorld();
}

@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "service disconnected");
}
};
}

@Override
protected void onStart() {
super.onStart();
Log.d(TAG, this.getApplicationContext().getPackageCodePath());
Intent service = new Intent(this.getApplicationContext(),LocalService.class);
this.bindService(service, mSc, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
super.onStop();
//must unbind the service otherwise the ServiceConnection will be leaked.
this.unbindService(mSc);
}
}



需要注意的是在onStop中要解绑定service, 否则会造成内存泄露的问题。


2. 我们再看一下与另外一个进程中的service进行通信的问题(跨进程通信!)。
如何将servcie运行在另外一个进程呢?在manifest 里面配置个属性就行了。
android:process=":remote" , 代表这个service运行在同一个应用程序的不同进程中。


<?xml version="1.0" encoding="utf-8"?>  
package="com.ckt.wangxin"
android:versionCode="1"
android:versionName="1.0" >



android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
android:name=".LocalServiceTestActivity"
android:label="@string/app_name" >

















public class RemoteServiceTestActivity extends Activity {  
static final String TAG = "RemoteServiceTestActivity";
ServiceConnection mSc;
public static final int SAY_HELLO_TO_CLIENT = 0;
/**
* Handler of incoming messages from service.
*/
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SAY_HELLO_TO_CLIENT:
Toast.makeText(RemoteServiceTestActivity.this.getApplicationContext(), "Hello World Remote Client!",
Toast.LENGTH_SHORT).show();
break;
default:
super.handleMessage(msg);
}
}
}

Messenger messenger_reciever = new Messenger(new IncomingHandler());

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

mSc = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "service connected");
Messenger messenger = new Messenger(service);
Message msg = new Message();
msg.what = RemoteService.MSG_SAY_HELLO;

msg.replyTo = messenger_reciever;
try {
messenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}

@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "service disconnected");
}
};
}

@Override
protected void onStart() {
super.onStart();
Log.d(TAG, this.getApplicationContext().getPackageCodePath());
Intent service = new Intent(this.getApplicationContext(),RemoteService.class);
this.bindService(service, mSc, Context.BIND_AUTO_CREATE);
}

@Override
protected void onStop() {
super.onStop();
//must unbind the service otherwise the ServiceConnection will be leaked.
this.unbindService(mSc);
}
}


获得service端传来的binder,用来构建一个Messenger向service发送消息。

public class RemoteService extends Service {  

public static final int MSG_SAY_HELLO = 0;

@Override
public IBinder onBind(Intent intent) {
return messager.getBinder();
}

Handler IncomingHandler = new Handler() {

@Override
public void handleMessage(Message msg) {
if(msg.replyTo != null){
Message msg_client = this.obtainMessage();
msg.what = RemoteServiceTestActivity.SAY_HELLO_TO_CLIENT;
try {
((Messenger)msg.replyTo).send(msg_client);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
switch (msg.what) {
case MSG_SAY_HELLO:
Toast.makeText(RemoteService.this.getApplicationContext(), "Hello World Remote Service!",
Toast.LENGTH_SHORT).show();
break;
default:
super.handleMessage(msg);
}
}

};

Messenger messager = new Messenger (IncomingHandler);
}

构建一个Messenger,包含一个handler,然后将messenger的binder传给客户端,客户端可以通过handler再构造一个messenger与service通信,消息在handler里面被处理。
现在是service端单向响应客户端的消息,同理可以做成双向发送消息,实现双向通信。

更多相关文章

  1. java后台接收android客户端通过http方式发送的数据
  2. android客户端与web服务端的数据通信
  3. android手机端与PC端使用adb forword通信
  4. Android中从服务器端向客户端传数据
  5. android远程更新客户端
  6. Android与Java AIO实现简单Echo服务器与客户端
  7. Android 进程间通信 实例分析
  8. android 项目串口通信(serialPort)开发遇到的炕

随机推荐

  1. Android连接网络
  2. 3. android 自动完成文本框
  3. Android(安卓)TextView 字体描边
  4. Android(安卓)监听手机GPS打开状态实现代
  5. Android获取WiFi ip相关信息
  6. How to make android app's background i
  7. Android工具类
  8. Android拍照、录像、录音代码范例
  9. 【Android学习三】相关指令操作
  10. android 里的动态提示