Android Messenger跨进程双向传递消息(可传递bundle)

news/2024/12/28 12:51:06/

在这里插入图片描述

一、服务端

AndroidManifest.xml中添加服务

<serviceandroid:name=".MyMessengerService"android:enabled="true"android:exported="true" ><intent-filter><action android:name="${applicationId}.MyMessengerService" /></intent-filter></service>

添加服务类

package com.example.aidlservice;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 androidx.annotation.NonNull;
import androidx.annotation.Nullable;import com.example.aidlservice.util.L;import java.util.ArrayList;
import java.util.List;/*** @author Liushihua* @date 2022-5-12 9:24* @desc*/
public class MyMessengerService extends Service {static final String TAG = "MyMessengerService";static final int MSG_FROM_CLIENT = 1;private Messenger messenger;private static List<Messenger> clients = new ArrayList<>();@Nullable@Overridepublic IBinder onBind(Intent intent) {L.d("onBind");messenger = new Messenger(new MessengerHandler());return messenger.getBinder();}static class MessengerHandler extends Handler {@Overridepublic void handleMessage(@NonNull Message msg) {switch (msg.what) {case MSG_FROM_CLIENT:L.d("收到客户端消息:" + msg.getData().get("name"));if (msg.replyTo != null) {//获取客户端发来得messengerclients.add(msg.replyTo);try {Message sendMsg = Message.obtain(null, 2, 0, 0);Bundle bundle = new Bundle();bundle.putString("name", "小李子你好");sendMsg.setData(bundle);msg.replyTo.send(sendMsg);} catch (RemoteException e) {//客户端已断开e.printStackTrace();clients.remove(msg.replyTo);//移除此客户端}}break;default:super.handleMessage(msg);}}}@Overridepublic boolean onUnbind(Intent intent) {L.d("onUnbind");return super.onUnbind(intent);}@Overridepublic void onDestroy() {L.d("onDestroy");super.onDestroy();}
}

二、客户端

Activity中代码段

 private Messenger messenger = null;//服务端messengerprivate boolean bound;//是否已连接服务端messengerprivate final Handler handler = new Handler(Looper.myLooper()) {@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);L.d("收到服务端返回消息:" + msg.getData().getString("name"));}};/*** Class for interacting with the main interface of the service.*/private ServiceConnection messengerConnection = new ServiceConnection() {//for messengerpublic void onServiceConnected(ComponentName className, IBinder service) {// This is called when the connection with the service has been// established, giving us the object we can use to// interact with the service.  We are communicating with the// service using a Messenger, so here we get a client-side// representation of that from the raw IBinder object.L.d("messengerConnection onServiceConnected");messenger = new Messenger(service);bound = true;}public void onServiceDisconnected(ComponentName className) {L.d("messengerConnection onServiceDisconnected");// This is called when the connection with the service has been// unexpectedly disconnected -- that is, its process crashed.messenger = null;bound = false;}};
findViewById(R.id.btnM).setOnClickListener(v -> {// Bind to the messengerServiceIntent intent = new Intent("com.example.aidlservice.MyMessengerService");//服务端定义的actionintent.setPackage("com.example.aidlservice");//服务端包名bindService(intent, messengerConnection, Context.BIND_AUTO_CREATE);});findViewById(R.id.btnMu).setOnClickListener(v -> {//解绑unbindService(messengerConnection);});findViewById(R.id.btnMS).setOnClickListener(v -> {//发送Messenger消息if (bound) {// Create and send a message to the service, using a supported 'what' valueMessage msg = Message.obtain(null, 1, 0, 0);// msg.obj="客户端消息";//不能这么用,发送不出去,报错:不是一个Parcelable数据Bundle bundle = new Bundle();bundle.putString("name", "小李子");msg.setData(bundle);try {msg.replyTo = new Messenger(handler);messenger.send(msg);} catch (RemoteException e) {e.printStackTrace();}}});

http://www.ppmy.cn/news/601152.html

相关文章

WebRTC中的信令和内网穿透技术 STUN / TURN

WebRTC可以进行P2P点对点通信&#xff0c;但是WebRTC仍然需要服务器&#xff1a; 客户端需要服务器交换一些数据来协调通信&#xff0c;这称之为信令。 使用服务器来应对NAT网络地址转换和防火墙。 在本文中&#xff0c;将介绍如何构建信令服务&#xff0c;以及如何使用STUN和…

Messenger--信使

Messenger可以在不同进程中传递Message对象&#xff0c;是一种轻量级的IPC方案&#xff0c;它的底层实现是AIDL。它对AIDL做了封装&#xff0c;使得我们可以更简单地进行进程间通信。它一次处理一个请求&#xff0c;因此在服务端我们不用考虑线程同步的问题。 //服务端 public…

Messenger的具体应用

之前的文章中最Messenager做过简单的介绍&#xff0c;但是在进程间的通讯实例却一直没有搞出来。下面演示简单的事例&#xff1a; 需求是这样的&#xff1a;我们需要具体的功能《垃圾清理》&#xff0c;既可以在App中调用&#xff0c;也可以在系统中快捷调用&#xff0c;同时可…

越来越“变态”的验证码,到底在验证什么?

验证码要验证的是它所面对的是真实的人还是计算机程序。最开始的验证码非常的简单&#xff0c;只要输入几个数字就可以。不知道从何时开始见证了变得越来越变态&#xff0c;变得花样不断的验证&#xff0c;验证码就不仅仅是视力的挑战了&#xff0c;有的时候已经是视力及智力的…

打造加速组织变革的PMO—新药研发PMO实践分享︱先声药业研发PMO负责人

先声药业研发PMO负责人谢少斐先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;打造加速组织变革的PMO—新药研发PMO实践分享。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; 2023年生物医药…

【软考网络管理员】2023年软考网管初级常见知识考点(25)- 网络地址转换NAT

涉及知识点 什么是NAT技术&#xff1f;静态网络地址转换&#xff0c;动态网络地址转换&#xff0c;基于端口的网络地址转换,NAPT的配置命令和动态NAT配置命令&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 原创于…

C语言发展史、前途、是否会被淘汰

发展史 C语言是1972年由Dennis Ritchie在贝尔实验室创建的&#xff0c;它是汇编语言的升级版本。在20世纪70年代中期&#xff0c;C语言被广泛应用于Unix操作系统的开发中&#xff0c;它的出现极大地简化了系统的编程&#xff0c;使Unix系统成为流行的操作系统之一。 在80年代…

汤姆猫java下载手机版_汤姆猫编程星球app下载-汤姆猫编程星球下载v1.0.8-西西软件下载...

汤姆猫编程星球是一款少儿编程教育软件&#xff0c;帮助想学习编程少年快速学习&#xff0c;多彩多样的玩法&#xff0c;锻炼孩子的思维性&#xff0c;逻辑性&#xff0c;从小时候就加强大脑的锻炼&#xff0c;喜欢的朋友可以在西西下载使用。 软件介绍 汤姆猫编程星球介绍和汤…