bound服务是客户端-服务器模式的服务。
bound服务的创建方式之一:
创建一个支持绑定的服务时,你必须提供一个 ,用作客户端和服务间进行通信的编程接口
使用Messenger定义该接口:
如果你需要接口跨越多个进程进行工作,可以通过来为服务创建接口。在这种方式下,服务定义一个响应各类消息对象的。此是与客户端共享同一个的基础,它使得客户端可以用消息对象向服务发送指令。此外,客户端还可以定义自己的,以便服务能够往回发送消息。
简单的说,就是服务和客户端都要有自己的Messenger,然后通过handler处理各自Messenger发送的message消息。(客户端和服务相互响应的原理)。
public class MessageService extends Service{ //本例的Service在声明时必须对外开放,即android:exported="true"。 //Messenger通信是不支持多线程的,要用到多线程就该换成AIDL通信 public static final int WHAT_1=1; Messenger client_messenger; @Override public void onCreate() { super.onCreate(); } public IBinder onBind(Intent intent) { return messenger.getBinder(); } public void onDestroy() { super.onDestroy(); } //通过handler创建一个messenger,Messenger实质是对handler的引用 final Messenger messenger=new Messenger(new MessageHandler()); //定义一个handler子类。用于接受message对象 class MessageHandler extends Handler{ @Override public void handleMessage(Message msg) { switch (msg.what) { case WHAT_1: client_messenger=msg.replyTo;//接受到传递过来的,客户端的Messsenger. 通过该Messenger发送消息到客户端 break; default: super.handleMessage(msg); } } } //发送客户端要处理的message public void sendClientMessage(){ Message message=Message.obtain(null, MessageActivity.CLIENT_WAHT, null); try { client_messenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } }
}
public class MessageActivity extends Activity {
//Service的Messenger对象 Messenger service_messenger=null; //客户端的Messenger对象 Messenger client_messenger=new Messenger(new ClientHandler()); boolean isBound; Message message; final static int CLIENT_WAHT=2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //绑定和解绑Service都是按需求而定的,说白了,哪里要用,就在那里绑定(或者解绑)。 protected void onStart() { Intent intent=new Intent(this,MessageService.class); bindService(intent, connection, Context.BIND_AUTO_CREATE);//通过绑定方式开启服务 super.onStart(); } protected void onStop() { //解除绑定 if(isBound){ unbindService(connection); } super.onStop(); } public void sendServiceMessage(){ if(isBound){ return ; } String content="Messenger方式解决当前service要被其他运用程序调用或者要跨多个进程间的通信"; message=Message.obtain(null, MessageService.WHAT_1 ,null); message.obj=content; message.replyTo=client_messenger; //将客户端的Messenger传递到Service中。不需要Service响应,则不需要写这行代码 //在Service里将通过客户端的Messenger发送消息到对应的客户端,然后进行处理( Service 响应客户端的原理 ) try { service_messenger.send(message); } catch (RemoteException e) { e.printStackTrace(); } } ServiceConnection connection=new ServiceConnection() { //与服务连接发生中断时(比如service崩溃或者被系统杀死)会被调用 //注意点:activity解除绑定不会调用 public void onServiceDisconnected(ComponentName arg0) { isBound=false; service_messenger=null; } //当与service绑定时会调用。 通过Messenger与Service进行通信 public void onServiceConnected(ComponentName className, IBinder ibinder) { isBound=true; service_messenger=new Messenger(ibinder); //获取到Service中的Messenger对象 } }; //用于处理Service传递的信息 class ClientHandler extends Handler{ public void handleMessage(Message msg) { switch (msg.what) { case CLIENT_WAHT: //需求而定,执行操作 break; default: super.handleMessage(msg); } } }}