bound服務是客戶端-服務器模式的服務。html
bound服務的建立方式之一:android
建立一個支持綁定的服務時,你必須提供一個 IBinder,用做客戶端和服務間進行通訊的編程接口web
使用Messenger定義該接口:編程
若是你須要接口跨越多個進程進行工做,能夠經過Messenger來爲服務建立接口。在這種方式下,服務定義一個響應各種消息對象Message的Handler。此Handler是Messenger與客戶端共享同一個IBinder的基礎,它使得客戶端能夠用消息對象Message向服務發送指令。此外,客戶端還能夠定義本身的Message,以便服務可以往回發送消息。服務器
簡單的說,就是服務和客戶端都要有本身的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();
}
}
ide
}this
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);
}
}
}
spa
}
線程