【Android个人理解(八)】跨应用调用不同组件的方法

如果情景:

创建两个应用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(信使)交互方式进行跨进程的数据传递。

时间: 2024-10-06 03:41:44

【Android个人理解(八)】跨应用调用不同组件的方法的相关文章

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

ThinkPHP 跨模块调用操作方法(A方法与R方法) 跨模块调用操作方法 前面说了可以使用 $this 来调用当前模块内的方法,但实际情况中还经常会在当前模块调用其他模块的方法.ThinkPHP 内置了 A方法与 R 方法这两个特殊的大写字母方法来处理跨模块调用的问题. 目前 Index 模块内有 index 操作,User 模块有 showName 操作,User 模块及 showName 操作具体代码如下: <?php class UserAction extends Action{ pu

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

关于ajax跨域调用WCF服务的方法很多,经过我反复的代码测试,认为如下方法是最为简便的,当然也不能说别人的方法是错误的,下面就来上代码,WCF服务定义还是延用上次的,如: namespace WcfService1 { [ServiceContract] public interface IAddService { [OperationContract] [WebInvoke(Method="GET",RequestFormat=WebMessageFormat.Json, Resp

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

在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据 一.父组件利用props往子组件传输数据 父组件: <div> <child v-bind:my-message="parentMsg"></child>//注意传递参数时要用-代替驼峰命名,HTML不区分大小写 </div> 子组件: Vue.component('child', { // camelCase in Ja

父组件中调用子组件的方法和属性

方案:利用ref属性可以获取到dom元素或者是子组件,从而可以调用子组件的方法(注意2.0版本用ref取代了el) 1.当ref直接定义在dom元素上时,则通过this.$refs.name可以获取到dom,对dom进行原生的操作 <div class="foods-wrapper" ref="foods-wrapper"> 通过this.$refs获取到dom进行操作(注意ref属性的命名不能用驼峰,同时获取的时候也不能用) let menuList

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

vue中如果父组件想调用子组件的方法,可以在子组件中加上ref,然后通过this.$refs.ref.method调用,例如: 父组件: <template> <div @click="fatherMethod"> <child ref="child"></child> </div> </template> <script> import child from '~/componen

父组件调用子组件的方法

我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法 父组件 子组件 原文地址:https://www.cnblogs.com/xianhao/p/10475314.html

vue.js(19)--vue中子组件调用父组件的方法

子组件是不能直接使用父组件中的方法的,需要进行事件绑定(v-on:自定义方法名="父组件方法名"),然后在子组件中再定义一个方法,使用this.$emit('自定义方法名')语句完成父组件中方法到子组件中的调用,最后直接调用子组件中定义的方法即可. <div class="app"> <mycom v-on:func="parentshow"></mycom> <!-- 通过v-on:绑定方法将父组件中的

angular 中父组件调用子组件的方法

angular中 父组件调用子组件的方法 -- 使用 @ViewChild 装饰器修饰子组件,获取方法,调用 除此之外 ViewChild 还可以获取 DOM ,操作 DOM , 详见: https://www.cnblogs.com/monkey-K/p/11567098.html 1. html 中使用 #var 方式标记 子组件 <div style="border: 1px solid red"> <p>子组件:</p>> <ap

react ,父子调用子组件的方法与子组件调用父组件的方法

1.父组件调用子组件的方法给子组件的标签 定义一个属性,例如 ref="zizu" ------------- 父组件通过,this.refs.biaoji.dream('哈哈') //调用子组件的dream方法 2.子组件调用父组件的方法 2.1.首先父组件需要通过给子组件自定义属性,把方法传递给子组件.2.2.子组件通过this.props 接收父组件的方法,this.props.方法名称().这样就可以调用父组件的方法了 原文地址:https://www.cnblogs.com/