当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Android远程服务编写和调用教程

    栏目:Linux/apache问题 时间:2020-02-07 11:18

    网上汗牛充栋的文章都是介绍Android远程服务的,一个个将Binder机制、AIDL讲得头头是道,然而没有几个人能够给出清晰的范例说明如何用最快的方法学会编写和调用一个Android远程服务。若你仅仅是想如何编写或者调用Android的远程服务,而懒得去理解Binder机制是如何运行的,那么本篇文章正好适合你。毕竟现在人人都会开车,但没有几个人明白发动机到底是如何运作的。

    预备知识

    读者应该有基本的java知识,和Android简单app的开发经验。

    环境

    代码运行环境:
    1.ADT2014版本;
    2.android:minSdkVersion=”8”;android:targetSdkVersion=”20”
    3.workspace中已经生成了appcompatv7,它的版本是android-22;

    远程服务开发教程

    在开始开发之前,先弄清楚几个概念:
    1. IPC:进程间通信,你只需要知道Android是依赖这个东西来进行远程服务调用的就可以了。
    2. Binder机制:Android发明的一种IPC机制,据说非常非常的好,你就当它是个黑盒子,通过这个黑盒子就可以进行远程服务调用了,而且Android中的很多机制都是通过它实现的。
    3. AIDL语言:一种专门用来写远程接口的语言,看它的名字就知道了,Android Interface Definition
    Language。AIDL语言可以被android提供的编译器编译为Java源代码,这个Java源代码将会被服务的和客户端使用,用来简化远程服务开发流程。如果你当初玩过CORBA,那就更能明白什么是IDL语言了
    4. IInterface接口、IBinder接口、IBinder类等等:都是用来实现Binder机制的接口和类,在本教程中,你就当它们是Binder黑盒子的一部分,不需要了解。
    再说一点,其实Android提供的ApiDemos中就有一个远程服务的标准范例,但是其一是它没有将服务端和客户端分开写,其二是例子中掺杂了太多其他的功能,因此理解起来较为困难。这个例子是com.example.android.apis.app.RemoteService,有兴趣的可以在看完本文后再去详细研究。

    第一步,创建一个普通Android应用

    应用名为WxbRemoteService,这个应用可以删掉其Activity类,但是为了简单,我们就保留所有自动创建的代码。

    第二步,编写AIDL

    AIDL语言的语法和Java其实很像,你甚至可以先编写一个Java接口,然后删掉public、protected、private这些权限限定词即可。例子如下IWxbService.aidl:

    package com.dumaisoft.wxbremoteservice;
    
    interface IWxbService {
     void setName(String name);
     String getName();
    }
    
    

    注意几点:
    1.接口名和aidl文件名相同。
    2.接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static。
    3.Aidl默认支持的类型包话java基本类型(int、long、boolean等)和(String、List、Map、 CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型作 为参数或返回值,自定义类型必须实现Parcelable接口。
    4.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。
    5.在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数。
    6.Java原始类型默认的标记为in,不能为其它标记
    IWxbService.aidl文件的位置是在com.dumaisoft.wxbremoteservice包中,只要语法正确,则会在ADT的gen目录下的com.dumaisoft.wxbremoteservice包中生成java文件IWxbService.java。