zoukankan      html  css  js  c++  java
  • 【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(信使)交互方式进行跨进程的数据传递。


  • 相关阅读:
    Swift # Apple Pay集成
    GitHub Top 100 简介
    一些常用算法
    CocoaPods 建立私有仓库
    安装 CocoaPods & Alcatraz
    iOS程序 # 启动过程
    Apache & WebDav 配置(二)
    SVN & Git (二)
    SVN & Git (一)
    poj 3169 Layout (差分约束)
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7027111.html
Copyright © 2011-2022 走看看