【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(信使)交互方式进行跨进程的数据传递。
最新文章
- 3、jvm内存分配实例
- Kafka Topic ISR不全,个别Spark task处理时间长
- 提高PHP性能的实用方法+40个技巧优化您的PHP代码
- 八大排序算法之四选择排序—堆排序(Heap Sort)
- HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)
- 《剑指Offer》之替换空格
- Oracle 学习系列之二(会话与事务级临时表和dual表 )
- iOS7 各种问题解决
- 自定义可判断选项是否正确listbox
- make menuconfig出错
- Zoom属性的使用介绍(IE私有属性)
- Webgis开源解决方案之环境搭建(三)
- 基于netty的socket服务端触发了channelInactive方法,但实际连接没有断开的问题
- linux/centos elasticsearch 环境搭建 安装 运行 使用
- vue 安装插件Refusing to install package with name &#39;???&#39;
- metasploit framework(九):SMB服务扫描
- [leetcode]Search a 2D Matrix @ Python
- vijos1098 经典LIS变形
- win8.1rtm专业版无法安装net3.5还有iis
- Java编程思想第四版勘误
热门文章
- 洛谷2850 【Usaco2006 Dec】虫洞Wormholes SPFA
- Unity Launcher类,轻松打开网页,照片,app 等
- 【UVa 116】Unidirectional TSP
- 二 JDK + mysql + yum + rpm
- ArcSDE学习笔记------了解ArcSDE
- 在Windows上调整SGA大小遭遇ora-27100、ora-27102错误的处理方法
- 16.C语言可变参数
- BZOJ 4003 左偏树
- XDoclet学习
- [Chromium文档转载,第007章]JNI on Chromium for Android