IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 底层学习---Android-IPC机制(四,Android开发基础面试题 -> 正文阅读

[移动开发]底层学习---Android-IPC机制(四,Android开发基础面试题

 private static final String TAG = "MessengerService";

private static final int CODE_MESSAGE = 1;

private static class MessengerHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case CODE_MESSAGE: {
                Log.e(TAG, "服务端收到了消息:" + msg.arg1);
                break;
            }
        }
    }
}

private Messenger messenger = new Messenger(new MessengerHandler());

public MessengerService() {

}

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

}


### 三、客户端

客户端首先要绑定服务端的 **Service**,绑定成功后通过 **ServiceConnection** 对象的 **onServiceConnected** 方法的参数 **IBinder** 来构造一个 **Messenger** 对象,之后通过 Messenger 对象即可向服务端发送消息了

/**

  • 作者:叶应是叶

  • 时间:2018/3/22 20:13

  • 描述:https://github.com/leavesC
    */
    public class MainActivity extends AppCompatActivity {

    private static final String TAG = “MainActivity”;

    private static final int CODE_MESSAGE = 1;

    private Messenger messenger;

    private ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
    messenger = new Messenger(service);
    }

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

    };

    private EditText et_message;

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

    @Override
    protected void onDestroy() {
    super.onDestroy();
    unbindService(serviceConnection);
    }

    private void bindService() {
    Intent intent = new Intent();
    intent.setClassName(“com.czy.messenger_server”, “com.czy.messenger_server.MessengerService”);
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
    }

    private void initView() {
    et_message = findViewById(R.id.et_message);
    Button btn_sendMessage = findViewById(R.id.btn_sendMessage);
    btn_sendMessage.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    if (messenger == null) {
    return;
    }
    String content = et_message.getText().toString();
    if (TextUtils.isEmpty(content)) {
    return;
    }
    int arg1 = Integer.valueOf(content);
    Message message = new Message();
    message.what = CODE_MESSAGE;
    message.arg1 = arg1;
    try {
    messenger.send(message);
    Log.e(TAG, “消息发送成功”);
    } catch (RemoteException e) {
    e.printStackTrace();
    }
    }
    });
    }

}


运行结果如下所示

![](https://upload-images.jianshu.io/upload_images/2552605-42a91fb87bdc7982.gif?imageMogr2/auto-orient/strip|imageView2/2/w/953/format/webp)



在上面的示例代码中我是用 Message 来承载需要发送的消息的,因为 Messenger 和 Message 都实现了 Parcelable 接口,所以可以跨进程传输。Message 中能用来承载数据的载体有 what、arg1、arg2、obj、Bundle、replyTo。当中,obj 字段在跨进程通信中只能用来承载系统提供的实现了 Parcelable 接口的对象,例如 Bundle 和 Intent。如果承载了非法数据(例如 String),则会发生运行时异常

![](//upload-images.jianshu.io/upload_images/2552605-36bd85418eb37b2d.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)

### 四、双向通信

以上的例子只是实现了单向通信,还要考虑下如何实现双向通信,即服务端如何向客户端反馈数据?这就需要客户端也需要通过 Handler 创建一个 Messenger 对象,并将该 Messenger 对象通过 Message 的 replyTo 参数传递给服务端,服务端取得该参数就可以回应客户端了

这里就直接修改上述 IPC 流程,将客户端发给服务端的 arg1 参数乘以 2 后再返回给客户端

首先修改服务端代码

private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case CODE_MESSAGE: {
Log.e(TAG, “服务端收到了消息:” + msg.arg1 + " " + ((Intent) msg.obj).getAction());
//取得客户端的 Messenger 对象
Messenger messenger = msg.replyTo;
Message message = new Message();
message.what = CODE_MESSAGE;
message.arg1 = 2 * msg.arg1;
try {
messenger.send(message);
Log.e(TAG, “服务端回复消息成功”);
} catch (RemoteException e) {
e.printStackTrace();

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-29 09:28:21  更:2021-08-29 09:28:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/31 6:32:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码