如果情景:

创建两个应用appA和appB,appA包括一个Service,此Service有一个堵塞方法每隔10秒钟产生一个随机数字,例如以下:
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个人理解(八)】跨应用调用不同组件的方法的更多相关文章

  1. 实现jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的方法

    关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace Wcf ...

  2. ThinkPHP 跨模块调用操作方法(A方法与R方法)

    ThinkPHP 跨模块调用操作方法(A方法与R方法) 跨模块调用操作方法 前面说了可以使用 $this 来调用当前模块内的方法,但实际情况中还经常会在当前模块调用其他模块的方法.ThinkPHP 内 ...

  3. VC中调用COM组件的方法(转载)

    原文参考:http://hi.baidu.com/mingyueye/item/53ebecd44da76917d80e4449 总结一下在VC中调用COM组件的方法 准备及条件: COM服务器为进程 ...

  4. vc中调用Com组件的方法详解

    vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGet ...

  5. vue组件之间的通信以及如何在父组件中调用子组件的方法和属性

    在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据 一.父组件利用props往子组件传输数据 父组件: <div> < ...

  6. vue 子组件调用父组件的方法

    vue中 父子组件的通信: 子组件通过 props: { //子组件中写的. childMsg: { //字段名 type: Array,//类型 default: [0,0,0] //这样可以指定默 ...

  7. Vue子组件调用父组件的方法

    Vue子组件调用父组件的方法   Vue中子组件调用父组件的方法,这里有三种方法提供参考 第一种方法是直接在子组件中通过this.$parent.event来调用父组件的方法 父组件 <temp ...

  8. react中直接调用子组件的方法(非props方式)

    我们都知道在 react中,若要在父组件调用子组件的方法,通常我们会采用在父组件定义一个方法,作为props转给子组件,然后执行该方法,可以获取到子组件传回的参数以得到我们的目的. 显而易见,这个执行 ...

  9. Vue中子组件调用父组件的方法

    Vue中子组件调用父组件的方法 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta ...

随机推荐

  1. perl模块

    查看perl模块安装目录:find `perl -e ‘print “@INC”‘` -name ‘*.pm’ -print 为什么要写或要模块呢?简言之:代码重用,更多见于写一组工具集,有很多地方是 ...

  2. sql server 2000 自动收缩数据库大小

    转载.......http://mars968.blog.163.com/blog/static/7400033200941642356258/ SQLServer2000压缩日志及数据库文件     ...

  3. 适用于OpenGL离屏渲染上下文的初始化代码

    说明 近期做图像算法.须要用到shader对图像进行处理,用glut会有窗体,不适合写成UT測试用例,须要创建一个无窗体的OpenGL上下文. 代码 这部分代码事实上是參考 Android的Skia ...

  4. ZOJ 1654 Place the Robots (二分匹配 )

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 Robert is a famous engineer. One ...

  5. 《R实战》读书笔记一

    你仅仅要想处理数据,<R实战>这本书就能够助你一臂之力. <R实战>的目标是让你认识R,而且可以对数据进行操作.可视化和理解.该书包含4部分16个章节8个附录. 第一部分:入门 ...

  6. 大型网站架构之JAVA中间件

    中间件就是在大型网站中,帮助各子模块间实现互相访问,消息共享或统一访问等功能的软件产品.常见的有: 远程服务框架中间件:主要解决各子模块之间互相访问的问题. 消息队列中间件:主要解决各子模之间消息共享 ...

  7. quartz 添加监听器listener

    全局注册,所有Job都会起作用 JobCountListener listener = new JobCountListener(); sched.getListenerManager().addJo ...

  8. 关于HTML5和CSS3的几个“新增”

    html5和css3分别是目前最新的web前端编程的标准,加入了新的标准和要求. 1.HTML5新增input输入类型,即type后面的值 文本域 <input type="text& ...

  9. OpenCV中Mat数据的访问报错

    最近再写一段程序的时候,要访问Mat中的元素.在定义Mat型数据的时候,用 Mat ObjectPoints(48,3,CV_32FC1,0) 对其进行初始化后,用at进行访问时报内存错误. Mat ...

  10. [Usaco2009 Feb]Stock Market 股票市场 完全背包

    Code: #include<cstdio> #include<algorithm> #include<iostream> #include<cstring& ...