Android Service 回顾

来源:互联网 发布:淘宝加盟的骗局揭秘 编辑:程序博客网 时间:2024/05/01 03:19

Android IntentService完全解析 当Service遇到Handler

Android aidl Binder框架浅析

Android 基于Message的进程间通信 Messenger完全解析

android跨进程通信(IPC):使用AIDL

对于 Service 部分的概念已经有些模糊了,趁假期又回顾了一下。之前翻译过官方文档,现在官网已经有中文了,方便了许多。过了一下相关的几个类源码,加深下印象,过程就不写了,几位大神都已经写的非常详细了。

Service

1. IntentServce

基于 HandlerThread 的 IntentService ,主要就是解决了 Service 需要自己创建线程的问题的,对于简单的任务来说这是个不错的选择。

2. Stub & Proxy

AIDL 只定义一个接口再格式化之后看还是非常清晰的,没有原来想象的那么复杂。同进程直接返回 Server 端直接调用方法,远程的话就返回 Proxy,内部封装了对 Server 的调用。数据传输基本上就是类似 Socket 的模式,客户端先写后读,服务端写读后写。

Stub.onTranscact

 @Override        public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {            switch (code) {                case INTERFACE_TRANSACTION: {                    reply.writeString(DESCRIPTOR);                    return true;                }                case TRANSACTION_add: {                    data.enforceInterface(DESCRIPTOR);                    int _arg0;                    _arg0 = data.readInt();                    int _arg1;                    _arg1 = data.readInt();                    int _result = this.add(_arg0, _arg1);                    reply.writeNoException();                    reply.writeInt(_result);                    return true;                }            }            return super.onTransact(code, data, reply, flags);        }

Proxy

  public int add(int x, int y) throws android.os.RemoteException {                android.os.Parcel _data = android.os.Parcel.obtain();                android.os.Parcel _reply = android.os.Parcel.obtain();                int _result;                try {                    _data.writeInterfaceToken(DESCRIPTOR);                    _data.writeInt(x);                    _data.writeInt(y);                    mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);                    _reply.readException();                    _result = _reply.readInt();                } finally {                    _reply.recycle();                    _data.recycle();                }                return _result;            }

3. 关于 AIDL 和 Messenger

之前一直以为 Messenger 和 AIDL 是两种不同的方式,这次把源码看了之后才知道其实是一个东西。Messenger 是直接定义 AIDL 方式的简化,都是基于 Binder 的,定义文件在IMessenger.aidl。

建议先看 AIDL 部分的原理,再看 Messenger 部分就非常清晰了。

0 0
原创粉丝点击