欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android——使用Messenger实现进程间通讯

程序员文章站 2022-01-09 09:51:06
1 Messenger 简介2 项目结构3 服务端 msger_S 代码(1)创建服务MyService.javapackage com.example.msger_s;import android.app.Service;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android....

1 Messenger 简介

Messenger 类实现了 Parcelable 接口,用于进程间传输并处理消息,调用流程如下:

Android——使用Messenger实现进程间通讯

  • Client 通过 bindService() 请求绑定 Service
  • Service 通过 messenger_s.getBinder() 获取 IBunder 并返回 Client
  • Client 通过 messenger_s =new Messenger(service) 获取 Service 的 Messenger
  • Client 通过 msg_c2s.replyTo=messenger_c 将自己的 Messenger 绑定到 msg_c2s
  • Client 通过 messenger_s.send(msg_c2s) 给 Service 发送消息
  • Service 通过 messenger_c=msg_c2s.replyTo 获取 Client 的 Messenger
  • Service 通过 messenger_c.send(msg_s2c) 给 Client 发送消息

本文全部代码见→使用Messenger实现进程间通讯

2 项目结构

Android——使用Messenger实现进程间通讯

3 服务端 msger_S 代码

(1)创建服务

MyService.java

package com.example.msger_s;

import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;

public class MyService extends Service {
    Messenger messenger_c; //客户端的Messenger

    @Override
    public IBinder onBind(Intent intent) {
        return messenger_s.getBinder();
    }

    private Messenger messenger_s = new Messenger(new Handler() {
        @Override
        public void handleMessage(Message msg_c2s) {
            super.handleMessage(msg_c2s);
            receive(msg_c2s);
            messenger_c = msg_c2s.replyTo; //获取客户端的Messenger
            send();
        }
    });

    private void receive(Message msg) { //接收来自客户端的消息
        Bundle bundle = (Bundle) msg.obj;
        String msg_c2s = bundle.getString("msg_c2s");
        Log.e("MyService", "来自客户端的消息:" + msg_c2s);
    }

    private void send() { //给客户端返回消息
        Message msg = new Message();
        Bundle bundle1 = new Bundle();
        bundle1.putString("msg_s2c", "hello client");
        msg.obj = bundle1;
        try {
            messenger_c.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

(2)注册服务

在 AndroidManifest.xml 文件中 application 节点下注册 service,如下。

<service
     android:name=".MyService"
     android:exported="true">
     <intent-filter>
           <action android:name="com.xxx.msger_s"/>
           <category android:name="android.intent.category.DEFAULT" />
     </intent-filter>
</service>

(3)主 Activity

MainActivity.java

package com.example.msger_s;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

4 客户端 msger_C 代码

(1)设计布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical"
    tools:context="com.example.msger_c.MainActivity">

    <EditText
        android:id="@+id/et_send"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:text="hello service"
        android:textSize="30dp"
        android:background="#ffcc66"/>

    <Button
        android:id="@+id/btn_send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
        android:textSize="30sp"
        android:text="发送"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="返回的消息:"
        android:textSize="30sp"
        android:layout_marginTop="100dp"/>

    <TextView
        android:id="@+id/tv_receive"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:textSize="30sp"
        android:background="#ffcc66"
        android:layout_marginTop="20dp"/>
</LinearLayout>

界面如下:

Android——使用Messenger实现进程间通讯

(2)主 Activity

MainActivity.java

package com.example.msger_c;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private Messenger messenger_s; //服务端的Messenger
    private EditText et_send;
    private Button btn_send;
    private TextView tv_receive;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        et_send = (EditText) findViewById(R.id.et_send);
        btn_send = (Button) findViewById(R.id.btn_send);
        tv_receive = (TextView) findViewById(R.id.tv_receive);
        btn_send.setOnClickListener(cl);
    }

    View.OnClickListener cl = new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            hideInputMethod(MainActivity.this, v); //关闭输入法
            if (v.getId()==R.id.btn_send) {
                String msg_c2s = et_send.getText().toString();
                sendMsg(msg_c2s);
            }
        }
    };

    private void sendMsg(String msg_c2s){
        if (messenger_s==null) {
            attemptToBindService();
        }
        Message msg = new Message();
        Bundle bundle = new Bundle();
        bundle.putString("msg_c2s",msg_c2s);
        msg.obj = bundle;
        msg.replyTo = messenger_c; //将客户端的Messenger传给服务端
        try {
            messenger_s.send(msg);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    private Messenger messenger_c = new Messenger(new Handler() { //客户端的Messenger
        @Override
        public void handleMessage(Message msg) { //处理服务端返回的消息
            super.handleMessage(msg);
            Bundle bundle = (Bundle) msg.obj;
            String msg_s2c = bundle.getString("msg_s2c");
            tv_receive.setText(msg_s2c);
        }
    });

    private void attemptToBindService() {
        Intent intent = new Intent();
        intent.setAction("com.xxx.msger_s");
        intent.setPackage("com.example.msger_s");
        bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }

    ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            messenger_s = new Messenger(service); //获取服务端的Messenger
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            messenger_s = null;
        }
    };

    private void hideInputMethod(Activity act, View v) { //关闭输入法
        InputMethodManager imm = (InputMethodManager) act.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(v.getWindowToken(),0);
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (messenger_s==null) {
            attemptToBindService();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (messenger_s!=null) {
            unbindService(conn);
        }
    }
}

5 效果展示

点击【发送】按钮,在服务端可以收到发送的消息,如下:

Android——使用Messenger实现进程间通讯

在客户端收到回复如下:

Android——使用Messenger实现进程间通讯

本文地址:https://blog.csdn.net/m0_37602827/article/details/108114891

相关标签: Android