码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-06-03 17:45:49      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:service   跨进程   同进程   组件   

假设情景:

创建两个应用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)       在Eclipse工程的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个人理解(八)】跨应用调用不同组件的方法

标签:service   跨进程   同进程   组件   

原文地址:http://blog.csdn.net/qq_22939165/article/details/46347553

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!