信使 Messenger

信使 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();
    }

}

点击向服务端发送消息:






猜你喜欢

转载自blog.csdn.net/yang__k/article/details/80343872