一.Messager介紹
Messager,故名思義信使的意思,能夠完成跨進程通信。
二.Messager的原理
Messager的2個構造方法:分別以handler和Ibinder爲參數
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
特點:
特點:
客戶端和服務端發送的都是message
使用handler接受消息(客戶端和服務端都是)
不需要編寫aidl文件
三 .使用步驟
服務端 moudle:messager_server
客戶端 moudle:messager_client
三 .使用步驟
服務端moudle:messager_server
(1)創建服務:MyService.java
public class MyService extends Service {
//TODO 創建信使對象:參數是handler處理客戶端發送來的消息
Messenger server_messager=new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//接受客戶端消息
Bundle bundle=msg.getData();
String message=bundle.getString("client_message");
Toast.makeText(MyService.this, "服務器發來的消息:"+message, Toast.LENGTH_SHORT).show();
//向客戶端發送消息
Messenger clientMessager = msg.replyTo;//用於獲取客戶端的信使
Message messenge= new Message();
Bundle bundle1=new Bundle();
bundle1.putString("server_message","客戶端你是不是傻啊");
messenge.setData(bundle1);
try {
clientMessager.send(messenge);
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
//TODO 返回server_messager的代理人,便於客戶端獲取服務端信使
@Nullable
@Override
public IBinder onBind(Intent intent) {
return server_messager.getBinder();
}
}
(2)清單文件註冊服務
1 2 3 4 5 OK,服務端的服務已經配置完畢客戶端moudle:messager_client
public class MainActivity extends AppCompatActivity {
//3.客戶端的信使:負責接受服務器發來的消息
private Messenger Clientmesssager=new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle=msg.getData();
String message=bundle.getString("server_message");
Toast.makeText(MainActivity.this, "接受到服務器發來的消息"+message, Toast.LENGTH_SHORT).show();
}
});
// 4. 客戶端發送消息給服務端
private Messenger Servermessenger;
private ServiceConnection connection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Servermessenger=new Messenger(service);//獲取服務端信使
Message message=new Message();
message.replyTo= Servermessenger;
Bundle bundle=new Bundle();
bundle.putString("client_message","你好啊服務器");
message.setData(bundle);
try {
Servermessenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.綁定服務
Intent intent=new Intent();
intent.setAction("com.bawei.1609A");
intent.setPackage("com.example.messager_server");
bindService(intent,connection, Service.BIND_AUTO_CREATE);
}
//2.解除綁定
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(connection);
}
}
注意:1.先啓動服務端,在啓動客戶端
2.Message攜帶數據必須使用bundle不然報錯
總結:
服務端:
接受消息: 創建Messager信使對象,參數爲handler
發送消息:獲得客戶端的信使對象
Messenger clientMessager = msg.replyTo;
客戶端
接受消息: 創建Messager信使對象,參數爲handler
發送消息:綁定服務成功創建Server端的Messager,參數爲binder
總結:
Messager
一.Messager介紹
Messager,故名思義信使的意思,能夠完成跨進程通信。
二.Messager的原理
Messager的2個構造方法:分別以handler和Ibinder爲參數
public Messenger(Handler target) {
mTarget = target.getIMessenger();
}
public Messenger(IBinder target) {
mTarget = IMessenger.Stub.asInterface(target);
}
我們可以在客戶端發送一個Message給服務端,在服務端的handler中會接收到客戶端的消息,然後進行對應的處理,處理完成後,再將結果等數據封裝成Message,發送給客戶端,客戶端的handler中會接收到處理的結果。