【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 ...
随机推荐
- JavaScript笔记(1)
JS前导: ECMA欧洲计算机制造者协会 ECMA-262 (ES5规范) ECMA-404(Json规范) wsc定义HTML.CSS.DOM规范 计算机程序分为: cpu密集(用于计算) I/O密 ...
- poj2728 Desert King(最小生成树+01分数规划=最优比率生成树)
题意 n个点完全图,每个边有两个权值,求分数规划要求的东西的最小值. (n<=1000) 题解 心态炸了. 堆优化primT了. 普通的就过了. 我再也不写prim了!!!! 咳咳 最优比率生成 ...
- [转载][来自csdn]RTS和CTS是什么意思?
原文链接: http://blog.csdn.net/zmq5411/article/details/6280332 这篇文章看着挺好,明白易懂,顺手转过来 34RTS和CTS是什么意思? 解释一:R ...
- SweetAlert的入门
在做后台管理系统,在用户交互这块(弹窗.提示相关),用了一款还不错的插件SweetAlert(一款原生js提示框,允许自定义,支持设置提示框标题.提示类型.确认取消按钮文本.点击后回调函数等等), 效 ...
- 洛谷 P1071 潜伏者
P1071 潜伏者 题目描述 R 国和 S 国正陷入战火之中,双方都互派间谍,潜入对方内部,伺机行动.历尽艰险后,潜伏于 S 国的 R 国间谍小 C 终于摸清了 S 国军用密码的编码规则: 1. S ...
- C#日期控件datetimepicker保存空值方法
方法一(推荐): 设置datetimepicker的属性ShowCheckBox为true 在窗口初始化时候,添加代码this.datetimepicker1.Checked = false; 保存日 ...
- Java 反射经常用法演示样例
<pre name="code" class="java">import java.lang.reflect.Constructor; import ...
- HTML5多文件上传
文章转载自:http://xiechengxiong.com/288.html 一个简单的HTML5多文件上传demo. 以前我们上传文件的时候,如果通过js上传,我们无法在本地直接预览图片,还得跑到 ...
- snmpd修改端口
http://blog.csdn.net/cau99/article/details/5077239 http://blog.csdn.net/gua___gua/article/details/48 ...
- azure云中 mount: wrong fs type, bad option, bad superblock on /dev/sdc1
2016-01-30 mount失败问题解决 [root@mofficedb2 ~]# mount /dev/sdc /dta mount: you must specify the filesyst ...