Android IPC(二)Messenger实现跨进程双向通信
上一篇:《Android IPC(一)跨进程通讯的几种方式、作用》
下一篇:《Android IPC(三)AIDL实现跨进程通信》
效果图:
MyService.java
public class MyService extends Service {private Handler handler = new Handler(Looper.getMainLooper()){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);//客户端→服务端Bundle bundle = msg.getData();bundle.setClassLoader(MyBean.class.getClassLoader());MyBean myBean = bundle.getParcelable("message");Toast.makeText(MyService.this,myBean.getName(),Toast.LENGTH_SHORT).show();//服务端→客户端try {Messenger clientMessenger = msg.replyTo;myBean = new MyBean();myBean.setName("皮卡丘对王睿使用了十万伏特");bundle = new Bundle();bundle.putParcelable("message",myBean);Message message = new Message();message.setData(bundle);message.replyTo = clientMessenger;clientMessenger.send(message);} catch (RemoteException e) {e.printStackTrace();}}};private Messenger messenger = new Messenger(handler);public MyService() {}@Overridepublic IBinder onBind(Intent intent) {return messenger.getBinder();}
}
MyBean.java
public class MyBean implements Parcelable {private String name;public MyBean(){}protected MyBean(Parcel in) {name = in.readString();}@Overridepublic void writeToParcel(Parcel dest, int flags) {dest.writeString(name);}@Overridepublic int describeContents() {return 0;}public static final Creator<MyBean> CREATOR = new Creator<MyBean>() {@Overridepublic MyBean createFromParcel(Parcel in) {return new MyBean(in);}@Overridepublic MyBean[] newArray(int size) {return new MyBean[size];}};public String getName() {return name;}public void setName(String name) {this.name = name;}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {private Button btnIPC;private Button btnSend;private Messenger messengerProxy;private Handler handler = new Handler(Looper.getMainLooper()){@Overridepublic void handleMessage(@NonNull Message msg) {super.handleMessage(msg);Bundle bundle = msg.getData();bundle.setClassLoader(MyBean.class.getClassLoader());MyBean myBean = bundle.getParcelable("message");handler.postDelayed(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this,myBean.getName(),Toast.LENGTH_SHORT).show();}},3000);}};private Messenger clientMessenger = new Messenger(handler);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btnIPC = findViewById(R.id.btn_ipc);btnIPC.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(MainActivity.this,MyService.class);bindService(intent, new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder iBinder) {messengerProxy = new Messenger(iBinder);Toast.makeText(MainActivity.this,"连接成功",Toast.LENGTH_SHORT).show();}@Overridepublic void onServiceDisconnected(ComponentName name) {}}, Context.BIND_AUTO_CREATE);}});btnSend = findViewById(R.id.btn_send);btnSend.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {MyBean myBean = new MyBean();myBean.setName("王睿对皮卡丘使用了精灵球");try {Message message = new Message();message.replyTo = clientMessenger;Bundle bundle = new Bundle();bundle.putParcelable("message",myBean);message.setData(bundle);messengerProxy.send(message);} catch (RemoteException e) {e.printStackTrace();}}});}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:layout_marginTop="50dp"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn_ipc"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:text="IPC连接"/><Buttonandroid:id="@+id/btn_send"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="50dp"android:layout_gravity="center"android:text="IPC通信"/></LinearLayout>
AndroidManifest.xml
增加
<serviceandroid:name=".MyService"android:process=":wangrui"></service>
链接:https://pan.baidu.com/s/1uW99PizyfbHL02WDjjDcbA
提取码:vr2n
Android IPC(二)Messenger实现跨进程双向通信相关推荐
- Android 模拟游戏手柄按键(跨进程 KeyEvent 事件)实践方案
Android 模拟游戏手柄按键(跨进程 KeyEvent 事件)实践方案
- Android中使用ContentProvider进行跨进程方法调用
原文同一时候发表在我的博客 点我进入还能看到很多其它 需求背景 近期接到这样一个需求,须要和别的 App 进行联动交互,比方下载器 App 和桌面 App 进行联动.桌面的 App 能直接显示下载器 ...
- android四个组件的跨进程通信
Android四大组件(Activity,service,broadcast,Content Provider)跨进程通信相信在android项目中进程用到,此处将一一做以说明以及总结. 1.简括: ...
- Android中Sharedpreferences牵涉到跨进程时不能实时读取的问题
转载请注明出处:http://blog.csdn.net/ns_code/article/details/11271053 在做课程表应用时,由于要设置课前提醒的时间,我通过Sharedprefere ...
- 使用Android RemoteCallbackList简化远端接口跨进程回调
RemoteCallbackList 负责维护远程接口列表的繁琐工作,通常用于执行从Service到其客户端的回调 跟踪一组已注册的IInterface回调,注意通过唯一的IBinder来识别它们(通 ...
- ❤️ Android IPC 之 Messenger使用 ❤️
目录
- 【朝花夕拾】Android跨进程通信总结篇
前言 原文:https://www.cnblogs.com/andy-songwei/p/10256379.html 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一. ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10256379.html],谢谢! 只要是面试高级工程师岗位,Android跨进程通信就是最受面 ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇...
前言 原文:https://www.cnblogs.com/andy-songwei/p/10256379.html 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一. ...
- Android开发之跨进程通信-广播跨进程实现方法(附源码)
真的特别简单,简单概述下android的四大组件都可以跨进程. Activity,广播,服务,内容提供者都可以 先看下跨进程传递数据的效果图 下面是两个APP用于模拟跨进程 再看下跨进程效果,AIDL ...
最新文章
- 一个北漂女孩-不想嫁给有钱人
- Unity3D正常行走和飞行的实现
- Java加载sklearn训练好的模型进行预测(无法搞定)
- 动手学无人驾驶(3):基于激光雷达3D多目标追踪
- 今天的就每天练习这招的企业即时通讯
- 关于推荐系统中的冷启动问题探讨(Approaching the Cold Start Problem in Recommender Systems)...
- leetcode题解持续更新
- linux 无盘 重新生成内核,Linux无盘系统_尐惢
- 据说币圈炒币亏钱的人,大多都是因为这6个原因!
- 三分钟了解多模光纤和单模光纤的区别-ielab
- css3扭蛋机,微信小程序扭蛋抽奖机css3动画实现详解.pdf
- SQL--打折日期交叉问题
- SCI-15种投稿状态
- java电商网站源码带前后台
- DX11小知识1-Direct 3D
- 谷歌翻译接口识别语言php,利用谷歌翻译接口实现网站多语言切换
- [Ubuntu] 可用云盘-尝试记录
- html iframe禁止横向滑动_iframe横向滚动条显示
- layer弹出层 shadeClose、shade解释
- 一文了解加解密、哈希函数、MAC、数字签名、证书、CA等