【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 常用命令:系统状态篇
前言 Linux常用命令中,有些命令可以用于查看系统的状态,通过了解系统当前的状态,能够帮助我们更好地维护系统或定位问题.本文就简单介绍一下这些命令. 1. 查看系统运行时间--uptime 有时候我 ...
- Httphelper头信息(ContentType)默认为text/html无懈可击
Httphelper头信息(ContentType)默认为text/html无懈可击转 http://www.sufeinet.com/thread-8623-1-1.html 我发现最近有几个网友提 ...
- 绿色版SecureCRT启动崩溃,遇到一个致命的错误且必须关闭
百度搜了半天,大家都是说删除注册表的VanDyke就能解决问题,但是我用的是绿色版的,删除VanDyke后还不行. 然后试了一下重新解压出一个绿色版的SecureCRT,发现能用. 但之前我配置了很多 ...
- 最全面的AndroidStudio配置指南总结-包括护眼模式
使用AndroidStudio开发APP已有半年多的时间了,从刚开始的不习惯到慢慢适应再到逐渐喜欢上AndroidStudio,中间的过程颇有一番曲折,现在把自己对AndroidStudio的配置心得 ...
- ios svn repository
xcode默认自带Git和svn,首先讲下xcode4.6.3下配置svn: 1.检測你的mac中是否安装了svn: (1) 打开终端,输入 svn --version 假设出现下图信息,则说明已经安 ...
- POJ 1611 The Suspects 并查集 Union Find
本题也是个标准的并查集题解. 操作完并查集之后,就是要找和0节点在同一个集合的元素有多少. 注意这个操作,须要先找到0的父母节点.然后查找有多少个节点的额父母节点和0的父母节点同样. 这个时候须要对每 ...
- [BZOJ4826][HNOI2017]影魔 可持久化线段树
链接 题意:给你 \(1\) 到 \(n\) 的排列 \(k_1,k_2,\dots,k_n\) ,对 \(i,j (i<j)\)来说,若不存在 \(k_s (i<s<j)\) 大于 ...
- BZOJ5106: [CodePlus2017]汀博尔
[传送门:BZOJ5106] 简要题意: 给出n棵树,初始高度为h[i],每棵树每个月长高a[i] 现有一个客户,需要至少s长的总木材,而且每次截取的木材必须是一整颗树而且高度大于等于L 求出最少的月 ...
- 12.ng-switch
转自:https://www.cnblogs.com/best/tag/Angular/ 根据作用域表达式动态切换把那个DOM元素包含在已经编译的模板中. 示例代码: <!DOCTYPE htm ...
- 推荐putty远程工具背景效果
设置高亮显示及其行号 syntax on set number 然后设置putty显示背景 如图 感觉这种效果比较舒适 推荐推荐