1. 系统服务(SystemServcie)、远程服务(RemoteService)、通知(Notification)

2. 系统服务:主要指SDK原生提供的一些系统级别的服务,比如电话服务、通知服务、闹钟服务、
    音频服务等,通常对应的是Framework提供给我们的一系列Manager。
    系统服务的获取:
        Context.getSystemService(String serviceName);
        这些服务名通常可以使用Context当中的一些常量
        比如,
        AudioManager audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        得到audio之后就可以通过该对象去访问AudioManager的非私有的成员

3. 远程服务:IPC跨进程服务。可以实现不同应用程序之间的服务的调用和成员的访问。
    实现机制:AIDL,安卓接口定义语言。实际上是一个接口,定义了远端客户端访问,服务的一些基本规则。
        接口文件中只定义一些抽象方法,不提供具体的实现。具体实现交给了接口实现类的代理对象。
    AIDL的定义规则:
        a. 文件名必须以".aidl"结尾
        b. 除了基本数据类型、String、Map、List、CharSequence之外,其余的类型都需要手动导包
        c. 其余的定义规则和Java中接口的定义类似
            使用interface关键字
            抽象方法可以省略abstract、权限只能是public,但是可以省略访问权限修饰符

    AIDL文件正确定义后可以通过ADT插件在gen目录下生成对应包以及对应接口名的Java文件

4. 远程服务的基本定义流程:
    a. 在src下某一个包下创建一个xxx.aidl文件
    b. 在xxx.aidl文件中定义接口信息
    c. 自动有ADT在gen目录下生成对应包以及同名Java文件
    d. 定义远程的服务类
    e. 需要在该类中实现一个xxx.Stub的对象,在此类对象中实现接口中的抽象方法,对象赋值Binder变量binder
    f. 需要在onBind方法中将上述binder对象返回
    g. 服务中的其他功能,按照普通服务进行定义即可
    h. 在清单文件中进行注册

5. 调用远程服务的基本流程:
    a. 将服务端提供aidl文件赋值到客户端src下同名的包下边
    b. 检查gen目录下是否生成了对象Java文件
    c. 创建ServiceConnection的子类,实现其两个抽象方法
        在onServiceConnected方法中
            需要提供xxx x = xxx.Stub.asInterface(service);
    d. 调用bindService将远程服务绑定成功,以便于回调onServiceConnected来得到接口对象
    e. 通过接口对象访问接口实现类中的成员方法,来完成相关操作
    f. 相关操作完成后可以调用unBindService来解除绑定

6. 系统服务里边Notification,通知。它是由NotificationManager来发出的通知,然后展示在状态栏以及下拉列表中。
    通常是一些推送消息或者提示消息。
    主要的使用流程:
    a. 获取通知的系统服务:作用是发送和删除通知
        NotificationManager nm = Context.getSystemService(Context.NOTIFICATION_SERVICE);
    b. 创建通知对象Notification对象
        Notification n = new Notification();
    
    c. 给n设置相关的属性:图标、标题、展示的时间戳、振动、声音、闪烁灯等
    d. 通过nm的notify方法来发出通知
    e. 可以通过nm的cancel方法来手动的删除通知