Messenger for Android process communication

There are several types of Android process communication, such as:

1> Bundle 

2> File sharing

3> AIDL

4> Messenger

5> ContentPrivider

6> Socket

Now only talk about Messenger, Messenger is a package based on AIDL. Let us use process communication without having to write AIDL ourselves.

========================================

                 Client-server one-way communication       

========================================

 

=========== Step1: Configure multi-configuration process  =============

Speaking of multi-process, first configure two processes in AndroidManifest, such as:

<activity android:name=".messenger.MessengerActivity">
</activity>

<service android:name=".messenger.MessengerService"
                android:process=":msgservice">
</service>

 

Activity has no configuration process, it defaults to the App process com.leo.dicaprio.myutilapp,

The service is configured with a process, so it is in the com.leo.dicaprio.myutilapp.msgservice process

Run, you can see two processes in Android Studio

 

=========== Step2: Create a server   =============

Create a service Service, Service maintains a Handler internally, the role of Handler is to process communication data. Use Handler to create Messenger.

Messenger is the bridge of process communication. But when the service is bound, it will be returned to the client.

class MessengerService : Service() {

    companion object {
        const val WHAT = 1000
        const val CLIENT_DATA = "client_data"
    }

    private val handler = object : Handler() {
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            if (msg?.what == WHAT) {
                val string = msg.data.getString(CLIENT_DATA)
                Log.d("MessengerService","content : $string")
            }
        }
    }

    private val mMessenger = Messenger(handler)

    override fun onBind(intent: Intent?) = mMessenger.binder
}

 

=========== Step3: Create a client   =============

Bind the service service, after successfully binding the service, obtain the Binder returned by the server to create a Messenger, and then use the Messenger to send data to the server.

class MessengerActivity : AppCompatActivity() {

    companion object {
        fun launch(context: Context) {
            context.startActivity<MessengerActivity>()
        }
    }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_messenger)

        //绑定服务
        val intent = Intent(this, MessengerService::class.java)
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
    }


    private val serviceConnection = object : ServiceConnection {

        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            //通过获取服务端返回的 IBinder 创建 Messenger
            val messenger = Messenger(service)

            //创建 Message
            val msg = Message()
            msg.what = MessengerService.WHAT
            val bundle = Bundle()
            bundle.putString(MessengerService.CLIENT_DATA, "this is a client message")
            msg.data = bundle

            //Messenger 把 Message 发出去
            messenger.send(msg)
        }

        override fun onServiceDisconnected(name: ComponentName?) {
        }
    }

    override fun onDestroy() {
        unbindService(serviceConnection)
        super.onDestroy()
    }

Come and see the result...obvious. The client sends the message to the server through Messenger, and the Handler of the server receives the message and parses it successfully, and prints..

 

At this point, the most basic process communication is complete. But the above is only one-way communication between client and server. What about two-way communication between client and server?

Okay, here comes a wave....

 

========================================

                 Client-server two-way communication       

========================================

 

===== Step1: Create a client   =====

In fact, based on the original foundation, the message is configured with one more Messenger, and this Messenger is passed to the server, and the server gets the Messenger

Send messages to the client through it.

class MessengerActivity : AppCompatActivity() {

    companion object {
        fun launch(context: Context) {
            context.startActivity<MessengerActivity>()
        }
    }


    private val handler = object : Handler() {
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            if (msg?.what == MessengerService.WHAT) {
                val data = msg.data
                val string = data.getString(MessengerService.SERVICE_DATA)
                Log.d("MessengerService", "content : $string")
            }
        }
    }

    private val clientMessenger = Messenger(handler)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_messenger)

        //绑定服务
        val intent = Intent(this, MessengerService::class.java)
        bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
    }

    private val serviceConnection = object : ServiceConnection {

        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            //通过获取服务端返回的 IBinder 创建 Messenger
            val messenger = Messenger(service)

            //创建 Message
            val msg = Message()
            msg.what = MessengerService.WHAT
            val bundle = Bundle()
            bundle.putString(MessengerService.CLIENT_DATA, "这是客户端发出的消息")
            msg.data = bundle

            // 设置 一个 Messenger 给服务端
            msg.replyTo = clientMessenger

            //Messenger 把 Message 发出去
            messenger.send(msg)
        }

        override fun onServiceDisconnected(name: ComponentName?) {
        }
    }

    override fun onDestroy() {
        unbindService(serviceConnection)
        super.onDestroy()
    }
    
}

By comparison, there is more: msg.replyTo = clientMessenger    This line of code, and the code to create  clientMessenger    . easier

 

 

===== Step2: Create a server   =====

The server side is also simple, just get Messenger and send messages through Messenger...

class MessengerService : Service() {

    companion object {
        const val WHAT = 1000
        const val CLIENT_DATA = "client_data"
        const val SERVICE_DATA = "service_data"
    }

    private val handler = object : Handler() {
        override fun handleMessage(msg: Message?) {
            super.handleMessage(msg)
            if (msg?.what == WHAT) {
                val string = msg.data.getString(CLIENT_DATA)
                Log.d("MessengerService", "content : $string")

                //通过 message 获取 Messenger
                val messenger = msg.replyTo
                val replyMessage = Message()
                replyMessage.what = WHAT
                val bundle = Bundle()
                bundle.putString(SERVICE_DATA, "这是服务端发出的消息")
                replyMessage.data = bundle

                //通过 Messenger 发送 message
                messenger.send(replyMessage)
            }
        }
    }

    private val mMessenger = Messenger(handler)

    override fun onBind(intent: Intent?) = mMessenger.binder
}

Well, look at the results of the operation:

 

Well, here, basically show the basic usage of Messenger...

 

There is no problem with the above code, please leave a message if you have any questions. Thank you!

Guess you like

Origin blog.csdn.net/Leo_Liang_jie/article/details/98751212