android 四大组件之Service 通过信使进行远程通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 四大组件之Service 通过信使进行远程通信相关的知识,希望对你有一定的参考价值。

服务使用绑定式:
  有两个定义一个服务端的信使,sMessenger = new Messenger(new Handler() {});

在这个信使中获取客户端的信息,在接收的Message中获取客户端的信使cMessenger,

向客户端发送消息是通过客户端信使cMessenger来发送消息。

  cMessenger.send(Message);

注意在onBind() 中返回一个IBinder对象,sMessenger.getBinder();

 

这个是为了客户端能够获取服务端信使sMessenger.

在ServiceConnection接口中sMessenger = new Messenger(IBinder);

这处获取的IBinder就是onBind() 中获取的IBinder对象,

在客户端就是通过获取的服务信使sMessenger来向服务端发送消息

sMessenger.send(msg);发送消息。

 

(1)在客户和服务端都创建一个自己的信使,

客户创建一个cMessenger  , 服务创建一个sMessenger

(2)通过方法获取一个对方的信使,   

在客户端通过ServiceConnection中获取sMessenger

在服务端通过获取的cMessenger = Message.reply 

(3)通过对方信使向对方发送消息

客户端:sMessenger.send(msg);

服务端:cMessenger.send(msg);

 

 

public class MyService extends Service { 
    public Messenger sMessenger = new Messenger(new Handler(){
        public void handleMessage(android.os.Message msg) {
            if(msg.what == 1){
                int age = msg.arg1 ;
                String name = (String)msg.obj;
                //获取客户端信使
                cMessenger = msg.replyTo;//通过消息获取客户信息
                Log.i("tag", name+"--->"+age);
                Message reply = Message.obtain();
                reply.arg1 = 1234;
                reply.obj = name+">>>>"+"roise";
                try {//通过客户端信使向客户发送消息
                    cMessenger.send(reply);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
            
        };
    });
    public void onCreate() {
        Log.i("tag", "ServiceonCreate()");
    };
    
    
    
    @Override
    public IBinder onBind(Intent intent) {
        Log.i("tag", "onBind()");
        //通过服务的信使获取IBinder
        return sMessenger.getBinder();
    }
    @Override
    public boolean onUnbind(Intent intent) {
        Log.i("tag", "onUnbind()");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        Log.i("tag", "Serviceondestroy");
        super.onDestroy();
    }
}

 

 

public class MainActivity extends Activity {
    
    Messenger sMessenger;
    Messenger cMessenger = new Messenger(new Handler(){
        public void handleMessage(android.os.Message msg) {
            //获取服务短消息
            String info = (String)msg.obj;
            
            int age = msg.arg1;
            
            Log.i("tag", "客户端接收到的消息"+info+age);
        };
    });
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
    }
    protected void onStart() {
        super.onStart();
        Log.i("tag", "ActivityonStart()");
        Intent intent = new Intent(MainActivity.this, MyService.class);
        bindService(intent, conn, BIND_AUTO_CREATE);
    };
    
    protected void onDestroy() {
        Log.i("tag", "ActivityunbindService()");
        super.onDestroy();
        unbindService(conn);
    };
    public void onSend(View v) {
        Message msg = Message.obtain();
        msg.arg1 = 12;
        msg.obj = "client";
     //为了双向通信,将客户端信使发送给对方 msg.replyTo
= cMessenger; msg.what = 1; try { sMessenger.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) {
        //通过ServiceConnection获取服务信使 sMessenger
= new Messenger(service); } }; }

 

以上是关于android 四大组件之Service 通过信使进行远程通信的主要内容,如果未能解决你的问题,请参考以下文章

Android四大组件之Service

Android四大组件之service

Android四大组件service之Bound Service

android 四大组件之---Service

Android四大组件之Service

android 四大组件之Service 结合通知