信使 Messenger:
1.服务端需要绑定服务让客户端访问
Messenger sMessenger=new Messenger(new Handler(){ });
public IBind onBind(Intent intent){
return 服务端的信使的Binder;
}
客户端可以通过该Binder还原出sMessenger的代理类;
2.让客户端绑定
ServiceConnection conn=new ServiceConnection(){
两个回调方法;
public void onServiceConnected(ComponentName name, IBinder binder) {
sMessenger=new Messenger(binder); //通过服务端的binder构造出服务端信使的代
理;
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
在绑定方法里写:bindService(intent,conn,BIND_AUTO_CREAT);
Intent intent=new Intent();
intent.setComponet(new ComponentName("服务端所在的包名","MyService所在的包名"))
在传递数据方法里传递数据,如果有对象或字符串要传递,必须放在Bundle中;
1.客户端:
public class MainActivity extends AppCompatActivity {
Messenger sMessenger;
ServiceConnection conn=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
sMessenger=new Messenger(binder); //通过服务端的binder构造出服务端信使的代理
Toast.makeText(MainActivity.this, "远程服务绑定成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onServiceDisconnected(ComponentName name) {
Toast.makeText(MainActivity.this, "远程服务挂起", Toast.LENGTH_SHORT).show();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Messenger cMessenger=new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
Grils grils= (Grils) msg.getData().getSerializable("yk1"); //接收服务器传递的数据
Toast.makeText(MainActivity.this, "收到服务器的回复"+grils+msg.arg1, Toast.LENGTH_SHORT).show();
}
});
public void bind(View view) {
Intent intent=new Intent();
//服务端所在的包名 //Myservice1所在的包名
intent.setComponent(new ComponentName("com.example.messengerservice","com.example.messengerservice.MyService1"));
boolean b= bindService(intent ,conn,BIND_AUTO_CREATE);
if(!b){
Toast.makeText(MainActivity.this, "绑定失败", Toast.LENGTH_SHORT).show();
}
}
public void send(View view) {
Message MsgToService=Message.obtain();
MsgToService.arg1=1111111;
MsgToService.arg2=66666;
Bundle bundle = new Bundle();
bundle.putSerializable("yk",new Grils("雪儿",23));
MsgToService.setData(bundle);
MsgToService.replyTo=cMessenger; //回信地址是客户端信使
try {
sMessenger.send(MsgToService); //使用服务端的信使把消息传递给服务端
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
要传递对象的实体类:
重点:(服务端和客户端的实体类要完全一样,包名也要一样)
public class Grils implements Serializable{
String name;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Grils(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Grils{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
2.服务端
注意不要忘记注册服务:
<service android:name=".MyService1" android:exported="true"/>
public class MyService1 extends Service {
private static final String TAG ="aaa" ;
Messenger sMessenger=new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
Grils grils = (Grils) msg.getData().getSerializable("yk");
Log.d(TAG, "handleMessage() called with: " + "msg= [" + msg + "]");
Toast.makeText(MyService1.this, "收到客户端消息"+grils+msg.arg1+msg.arg2, Toast.LENGTH_SHORT).show();
//给客户端回信
Messenger cMessenger = msg.replyTo;
Message replay=new Message();
replay.arg1=88888;
Bundle bundle = new Bundle();
bundle.putSerializable("yk1",new Grils("籽涵",1));
replay.setData(bundle);
try {
cMessenger.send(replay); //用客户端的信使数据传给客户端
} catch (RemoteException e) {
e.printStackTrace();
}
}
});
@Nullable
@Override
public IBinder onBind(Intent intent) {
return sMessenger.getBinder(); // return 服务端的信使的Binder;
}
@Override
public boolean onUnbind(Intent intent) {
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onCreate() {
super.onCreate();
}
}
点击向服务端发送消息: