信使 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(); } }
点击向服务端发送消息: