【Android个人理解(八)】跨应用调用不同组件的方法
如果情景:
public int getRandomInt(){
Thread.sleep(10000);
return someRandomInt;
}
appB调用appA中Service.getRandomInt()的方法,将数字显示在界面上.
解决方式:
我们都知道。从层次上,大体能够分进程,任务,组件。线程。Android系统使得开发人员对于任务、组件界限相对清晰,而对于进程具有进程托管的说法,而对于线程就全然是开发人员自己的问题,Android系统没有做太多的约束。
因为题目相对简单,组件仅仅有一个appB的Activity和一个appA的Service,因此我们的层次关系为:
进程 线程 组件
1、若两个组件在同一进程中:
通过设置<process>属性,将相关应用,塞进一个进程,使得它们能够同生共死,拥有共同的内存区域。
由于问题要求每隔10秒进行一次通信,属密集操作。这样能够节省开支。
自己定义接口:
1) 自己定义一个接口。该接口中有一个得到随机数的空方法。
2) Server端用一个类继承自Binder并实现该接口。覆写了得到随机数的空方法。
3) Client端通过ServiceConnection获取到该类的对象。从而可以使用该获取当前下载进度的方法,终于实现实时交互。
4) Server端重写onBind()方法,返回binder对象。
5) Activity中重写onServiceConnected获得Service对象。
6) 开一个后台线程。用Service对象调用getRandomInt()。
7) 通过Handler将数据返回给主线程,更新View。
(另开一个后台线程的原因是getRandomInt()里的方法sleep(10000)会使main线程休眠。造成界面卡顿。
事实上这样使Service组件浪费。最好的方式是启动Service。然后再进行通信)
2、若两个组件不在同一进程中:
设置<process>属性,划分到不同的进程
RPC即Remote Procedure Call远程进程调用。而Android的进程间的通信是通过AIDL服务实现。以Binder为基础的IPC是RPC的一部分。
1) 在Eclipseproject的package文件夹中建立一个扩展名为aidl的文件。aidl文件里定义的是AIDL服务的接口。即面向接口的编程。同上含有getRandomInt()的空方法。
2) 建立一个服务类(Service的子类)。
实现由aidl文件生成的getRandomInt()。
3) 在AndroidManifest.xml文件里配置AIDL服务。即在Service中intent-filter标签下声明。
4) 在appB的Activity内开一个后台线程,线程内创建ServiceConnection对象 ,获得AIDL服务对象 ,调用getRandomInt()方法。
5) 通过Handler将数据返回给主线程,更新View。
(与单进程类似)
假设单纯实现组件之间的通信,而不是调用另个组件的方法,能够有很多其它方式:
在同一进程中:
1)在appA的manifest文件里设置Service的Android:exported="true"。
2)appB的Activity设置监听事件,通过startService()发送intent的方式调用启动appA的Service。
然后通过Handler、SharedPreferences等方式线程间传递数据。
而在不同一进程中:
能够使用Boradcast。ContentProvider。Mssenger(信使)交互方式进行跨进程的数据传递。
【Android个人理解(八)】跨应用调用不同组件的方法的更多相关文章
- 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法
关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...
- ThinkPHP 跨模块调用操作方法(A方法与R方法)
ThinkPHP 跨模块调用操作方法(A方法与R方法) 跨模块调用操作方法 前面说了可以使用 $this 来调用当前模块内的方法,但实际情况中还经常会在当前模块调用其他模块的方法.ThinkPHP 内 ...
- VC中调用COM组件的方法(转载)
原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...
- vc中调用Com组件的方法详解
vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGet ...
- vue组件之间的通信以及如何在父组件中调用子组件的方法和属性
在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据 一.父组件利用props往子组件传输数据 父组件: <div> < ...
- vue 子组件调用父组件的方法
vue中 父子组件的通信: 子组件通过 props: { //子组件中写的. childMsg: { //字段名 type: Array,//类型 default: [0,0,0] //这样可以指定默 ...
- Vue子组件调用父组件的方法
Vue子组件调用父组件的方法 Vue中子组件调用父组件的方法,这里有三种方法提供参考 第一种方法是直接在子组件中通过this.$parent.event来调用父组件的方法 父组件 <temp ...
- react中直接调用子组件的方法(非props方式)
我们都知道在 react中,若要在父组件调用子组件的方法,通常我们会采用在父组件定义一个方法,作为props转给子组件,然后执行该方法,可以获取到子组件传回的参数以得到我们的目的. 显而易见,这个执行 ...
- Vue中子组件调用父组件的方法
Vue中子组件调用父组件的方法 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta ...
随机推荐
- Linux 下安装 redis 详情
一:将redis 压缩包上传到 Linux usr/local下 (一):在local 下创建一个 redis 目录 (二):上传redis压缩包到此目录下. 二:Linux 进入 local目录下 ...
- 紫书 例题 10-22 UVa 1640(数位统计)
这道题的题解有几个亮点 一个是每次只统计一个数字来简化思维 一个是统计当前位数的时候分三个部分来更新答案 具体看代码,有注释 #include<cstdio> #include<cs ...
- 【习题 8-17 UVA - 11536】Smallest Sub-Array
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法. 考虑一个1..i的窗口. 里面在到达了i位置的时候恰好有1..k这些数字了. 为了更接近答案. 显然可以试着让左端点变成2 ...
- URAL 1513. Lemon Tale(简单的递推)
写几组数据就会发现规律了啊. .但是我是竖着看的.. .还找了半天啊... 只是要用高精度来写,水题啊.就当熟悉一下java了啊. num[i] = 2*num[i-1]-num[i-2-k]. 15 ...
- OpenCv 人脸检測的学习
近期公司要组织开发分享,可是自己还是新手真的不知道分享啥了,然后看了看前段时间研究过OpenCv,那么就分享他把. openCv就不介绍了,说下人脸检測.事实上是通过openCv里边已经训练好的xml ...
- 基于BP神经网络的简单字符识别算法自小结(C语言版)
本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前面的闲话: 自我感觉自己应该不是一个非常 ...
- 并查集树数据结构hdu1325
我的解法就是去构造了一棵树 以数组的存储方式 数组的值存放节点的根. 排除空树 剩下的就是出现环和多根节点的情况 也就是排除森林和有一个节点多个入度的情况 排除森林就用到了并查集 也就是便利数组让其仅 ...
- Introduction to IIS Architectures
https://docs.microsoft.com/en-us/iis/get-started/introduction-to-iis/introduction-to-iis-architectur ...
- SQL Server 2005高可用性模式下创建数据库镜像
SQL Server 2005高可用性模式下创建数据库镜像 高可用性模式下创建数据库镜像 第一步: --创建镜像用数据库-在主服务器上操作 create database db_mirror on ...
- SQL server 事务介绍,创建与使用
事务(Transaction)事务是一种机制,一个操作序列,包含一组操作指令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求(即要么全部执行,要么全部不执行)---------------- ...