Android远程服务与本地服务的特点以及功能差异

最近又重新看了点IPC的相关知识,以前看过不少Binder的知识,看到c++层思路就很模糊了,回头再看也算是一种学习。

IPC全称为:interprocess communication内部进程间通信,官方地址:http://developer.android.com/intl/zh-cn/guide/components/aidl.html,网上对这一块介绍的资料也着实不少,入门的话还是推荐看老罗的。


鉴于以前也知识看看相关知识,从来也没动手去做过,于是就照着官方文档开始动手创建Demo, 在按照官方文档实现之后,我察觉到有一个需求,官方只是说客户端可以调用远程服务端,那么远程服务端想要调用客户端可不可以呢?


为了尽快实现需求,那我就先将服务启动在本地,也就是说与Service与Activity处于同一进程,进行测试。它的结果是可行的,相关代码如下:

Activity相关代码:

<span style="font-family:Microsoft YaHei;font-size:14px;">public class MainActivity extends ActionBarActivity implements ServiceConnection, IServiceConnect {public final static String TAG = "MainActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {...bindService(new Intent("com.example.aidl.RemoteService"), this, BIND_AUTO_CREATE);}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {
<span style="white-space:pre">		</span>Log.e(TAG, "MainActivity onServiceConnected " + name + " - " + service);if (service instanceof ServiceBinder) {ServiceBinder new_name = (ServiceBinder) service;// 获取服务的引用,使服务与Activity建立双向关系RemoteService service2 = new_name.getService();service2.setmServiceConnect(this);}}...@Overridepublic void callback() {// 这种模式只有在同一进程中的服务才可以被使用Log.e(TAG, "MainActivity 被服务端调用");}@Overrideprotected void onDestroy() {super.onDestroy();unbindService(this);}
}
</span>
Service相关代码:

<span style="font-family:Microsoft YaHei;font-size:14px;">public class RemoteService extends Service implements Runnable {public final static String TAG = "RemoteService";public IServiceConnect mServiceConnect;...@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "RemoteService onBind");return new ServiceBinder(this);//返回含有服务引用的内部类}public static class ServiceBinder extends Binder {private RemoteService service;public ServiceBinder(RemoteService service) {super();this.service = service;}public RemoteService getService() {return service;}}public void setmServiceConnect(IServiceConnect mServiceConnect) {this.mServiceConnect = mServiceConnect;new Handler().postDelayed(RemoteService.this, 3000);//当建立连接之后启动一个任务}@Overridepublic void run() {if (mServiceConnect != null) {mServiceConnect.callback();//调用Activity的相关方法,验证通信}}}
</span>

上述结果是可以在同一进程的Activity与Service间互相通信的,因为在onServiceConnected中回调的Binder对象则为刚刚Service返回的对象,在Activity中打印的Log如下:

那么跨进程间互相通信可不可以呢?

我们在Service的Manifest文件中给Service添加Process属性,属性值为:remote:

<span style="font-family:Microsoft YaHei;font-size:14px;"><serviceandroid:name="com.example.aidl.RemoteService"android:process=":remote" ><intent-filter><action android:name="com.example.aidl.RemoteService" /><category android:name="android.intent.category.DEFAULT" /></intent-filter></service></span>
好了,这下启动服务之后,它就属于远程服务了,它与Activity不属于同一个进程,在Android中一个进程则是一个虚拟机。

如果我再按照刚才的方法进行测试,服务是启动了,但是Activity收到的Binder对象却是这样的:


这里是说,返回的组件名称为RemoteService,但是返回的Binder对象则为BinderProxy,这个BinderProxy则为RemoteService远程服务在本地的代理,熟悉AIDL的相关信息的人,肯定知道Proxy知道是什么。
那么我们在这里可不可以从Proxy对象中把远程的RemoteService对象拿到呢,我们看一下调试信息:

我们看到在Proxy中的并没有RemoteService的引用,嗯,因为IPC通信,是跨进程的,我们都是通过代理与服务打交道的,所以...


那么回到标题,说说远程服务与本地服务的特点与差异:

其实都是服务,提供的功能一致,只是一个在本地,一个在其它进程,所以,服务与客户端打交道的时候就有了不同,要谨慎对待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479418.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

svn中文语言包安装(最详细步骤)+Language Pack+TortoiseSVN 安装

原文链接&#xff1a;https://blog.csdn.net/massillon/article/details/102780782 svn中文语言包安装(最详细步骤) 一. 查看自己的SVN 版本(这里省略也可以,同事1.9版本的直接在官网下载的语言包也能用,区别对待把,可以先直接在官网下载,不行再去找对应版本语言包) 1.打开SVN找…

我拿模型当朋友,模型却想泄漏我的隐私?

文 | 阿毅编 | 小轶相信大家对Facebook–Cambridge Analytica隐私泄露事件都还有印象。这事儿在当时可谓爆炸性新闻&#xff0c;激起了公众对数据隐私的强烈关注&#xff0c;也间接影响了美国总统选举结果&#xff08;这不是重点&#xff09;。不过从事后诸葛亮来看&#xff0c…

论文浅尝 | SPARQL 语言的 ASK 查询表达性研究进展

论文作者之一&#xff1a;杨炫兴&#xff0c;天津大学博士生。链接&#xff1a;http://cic.tju.edu.cn/faculty/zhangxiaowang/publication/ASK.pdf动机SPARQL是万维网联盟&#xff08;World Wide Web Consortium&#xff0c;简记W3C&#xff09;推荐的知识图谱标准查询语言&am…

LeetCode 1021. 删除最外层的括号(栈)

文章目录1. 题目2. 解题1. 题目 题目链接 示例 1&#xff1a;输入&#xff1a;"(()())(())" 输出&#xff1a;"()()()" 解释&#xff1a; 输入字符串为 "(()())(())"&#xff0c;原语化分解得到 "(()())" "(())"&#xf…

JVM CPU Profiler技术原理及源码深度解析

研发人员在遇到线上报警或需要优化系统性能时&#xff0c;常常需要分析程序运行行为和性能瓶颈。Profiling技术是一种在应用运行时收集程序相关信息的动态分析手段&#xff0c;常用的JVM Profiler可以从多个方面对程序进行动态分析&#xff0c;如CPU、Memory、Thread、Classes、…

Facebook提出生成式实体链接、文档检索,大幅刷新SOTA!

文 | 花小花Posy导言最近ICLR的rebutal 前后分数对比出来了&#xff0c;很多评委都改了分数&#xff0c;有改多的&#xff0c;也有改少的。今天给大家介绍的这篇高分论文竟然在rebuttal前后都保持高分&#xff0c;证明评委们对它的认可程度是很高的。实体检索任务的定义是&…

论文浅尝 | 知识库问答中关系检测的学习表示映射

论文笔记整理&#xff1a;吴涵&#xff0c;天津大学硕士&#xff0c;研究方向&#xff1a;自然语言处理。链接&#xff1a;Paper: https://arxiv.org/pdf/1907.07328v1.pdfCode: https://github.com/wudapeng268/KBQA-Adapter引入在关系检测任务中&#xff0c;对于训练数据中已…

LeetCode 1175. 质数排列

文章目录1. 题目2. 解题1. 题目 请你帮忙给从 1 到 n 的数设计排列方案&#xff0c;使得所有的「质数」都应该被放在「质数索引」&#xff08;索引从 1 开始&#xff09;上&#xff1b;你需要返回可能的方案总数。 让我们一起来回顾一下「质数」&#xff1a;质数一定是大于 1…

ICLR最高分论文揭秘模型泛化,GNN是潜力股

文 | Jerry Qiu编 | 小轶我们都知道&#xff0c;人类在很多任务上都可以很好地完成“外推”&#xff0c;例如&#xff1a;啊不——我是说——例如&#xff0c;我们学会两位数的加减乘除后&#xff0c;就可以轻松将其推广至任意大整数的四则运算&#xff1a;从数学的角度来讲&am…

Android系统原生应用解析之桌面闹钟及相关原理应用之时钟任务的应用(一)

前段时间我一个朋友在面试回来问我&#xff1a;那个公司要5天之内完成一个项目&#xff0c;功能包括每天早上6点开始执行定时任务&#xff0c;大批量图片上传&#xff0c;大批量数据库同步。我心想&#xff0c;后两个功能还好说&#xff0c;可就是每天早上6点开始执行的这种定时…

配送交付时间轻量级预估实践

1. 背景 可能很多同学都不知道&#xff0c;从打开美团App点一份外卖开始&#xff0c;然后在半小时内就可以从骑手小哥手中拿到温热的饭菜&#xff0c;这中间涉及的环节有多么复杂。而美团配送技术团队的核心任务&#xff0c;就是将每天来自祖国各地的数千万份订单&#xff0c;迅…

论文浅尝 | 面向 cQA 的跨语言问题检索方法

论文笔记整理&#xff1a;谭亦鸣&#xff0c;东南大学博士生&#xff0c;研究方向为知识库问答。来源&#xff1a;WWW2019链接&#xff1a;https://dl.acm.org/citation.cfm?doid3308558.3313502本文提出了一种面向cQA的跨语言问题检索方法&#xff0c;旨在对于给定的问题检索…

揭秘Python并发编程——协程

原文链接&#xff1a;https://baijiahao.baidu.com/s?id1649450510185145678&wfrspider&forpc Python并发编程一直是进阶当中不可跨越的一道坎&#xff0c;其中包括进程、线程、协程&#xff0c;今天我们就来聊一聊协程。协程的定义很简单&#xff0c;从头到尾只有一条…

LeetCode 804. 唯一摩尔斯密码词(哈希+set)

文章目录1. 题目2. 解题1. 题目 国际摩尔斯密码定义一种标准编码方式&#xff0c;将每个字母对应于一个由一系列点和短线组成的字符串&#xff0c; 比如: “a” 对应 “.-”, “b” 对应 “-…”, “c” 对应 “-.-.”, 等等。 为了方便&#xff0c;所有26个英文字母对应摩尔…

计算机基础晦涩难懂?那你是没看他的图解文章!

这年头&#xff0c;写计算机基础的人好之又少&#xff0c;能把枯燥无味的计算机基础写的通俗易懂的人更是少&#xff0c;而就有一位叫「小林coding」的公众号横空出世&#xff0c;真的是一股清流&#xff0c;他酷爱「图解」计算机基础文章&#xff0c;真正做到了图解&#xff0…

Litho在美团动态化方案MTFlexbox中的实践

1. MTFlexbox MTFlexbox是美团内部应用的非常成熟的一种跨平台动态化解决方案&#xff0c;它遵循了CSS3中提出的Flexbox规范来抹平多平台的差异。MTFlexbox适用于重展示、轻交互的业务场景&#xff0c;与现有HTML、React Native、Weex等跨平台方案相比&#xff0c;MTFlexbox具备…

服务器部署docker

服务器部署docker docker简介## 可以把docker是一个容器&#xff0c;可以让开发者将自己的项目部署到这个容器中&#xff0c;最常用的场景是将自己的后端项目部署到服务器的时候会将其打入docker镜像中&#xff0c;可以理解为一个开销更小的虚拟机。 docker好处## 可以轻易地让…

LeetCode 461. 汉明距离(异或^ 与)

文章目录1. 题目2. 解题1. 题目 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y&#xff0c;计算它们之间的汉明距离。 注意&#xff1a; 0 ≤ x, y < 2^31.示例:输入: x 1, y 4输出: 2解释: 1 (0 0 0 1) 4 (0 1 0 0)…

论文浅尝 | NumNet: 一种带有数学推理的机器阅读理解模型

论文笔记整理&#xff1a;吴林娟。来源&#xff1a;EMNLP2019论文链接&#xff1a;https://arxiv.org/pdf/1910.06701.pdf开放源码&#xff1a;https://github.com/ranqiu92/NumNet概述本文提出了一个将数学推理融入机器阅读理解的模型——NumNet&#xff0c;其中利用数字感知的…

2021,你好哇!发个小红包可好~

小伙伴们&#xff0c;大家新年快乐哇&#xff5e;凡是过往皆序章&#xff0c;所有将来皆可盼。2020磨难太多&#xff0c;就祝大家2021多吃不胖叭&#xff01;原创即正义&#xff01;2020年对卖萌屋来说是非常不平凡的一年。这一年的时间里&#xff0c;卖萌屋坚守内容创作的初心…