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接受消息(客戶端和服務端都是)
不需要編寫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中會接收到處理的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章