1. 首先从抽象层次上来讲。AIDL实际上是在玩远程代理。远程代理对象,完成进程间通信:
2. 下面这个图展示了BinderProxy,Binder 和IBinder的关系。值得注意的是,其中Binder的transaction方法是没有用处的, 本地的调用没有必要执行transaction。另外,由于本地桩要接收消息,因此Binder有个方法会被调用,也就是execTransact, 这个方法是用native的onTransact调用过来的。因此,onTransact可以被认为是接受消息的事件。
3.
有了以上的理论基础,抛开AIDL语法,自己写AIDL通信。其实也很简单。 看看上面的桩,它继承于Binder,同时又实现了接口IInterface, 这是一个适配者模式。谈到适配者模式,一种方式就是通过继承进行适配。还有一种方式是通过组合, 现在就把这种适配者模式改为组合吧!这里既有代理模式,又有适配者模式,主要看所说的参与者对象是什么。
他们俩最大的区别就是:
l 代理模式俩对象都是相同的接口。
l 而适配者模式不是。
public class CommonBinder extends Binder { private OnTransactListener mOnTransactListener; public void setOnTransactListener(OnTransactListener lsr) { mOnTransactListener = lsr; } @Override protected boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { if (mOnTransactListener != null) { return mOnTransactListener.onTransact(code, data, reply, flags); } return super.onTransact(code, data, reply, flags); } }
其中的listener
public interface OnTransactListener { public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException; }
对桩进行修改,使其使用组合的方式来适配
public abstract class Stub implements IMyService, OnTransactListener { private static final String DESCRIPTOR = "com.a51droidgame.testmemoryleak.IMyService"; private CommonBinder mCommonBinder; /** * Construct the stub at attach it to the interface. */ public Stub(CommonBinder commonBinder) { mCommonBinder = commonBinder; commonBinder.setOnTransactListener(this); mCommonBinder.attachInterface(this, DESCRIPTOR); } /** * Cast an IBinder object into an com.a51droidgame.testmemoryleak.IMyService interface, * generating a proxy if needed. */ public static IMyService asInterface(android.os.IBinder obj) { if ((obj == null)) { return null; } android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); if (((iin != null) && (iin instanceof IMyService))) { return ((IMyService) iin); } return new Proxy(obj); } @Override public android.os.IBinder asBinder() { return mCommonBinder; } @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_sayHello: { data.enforceInterface(DESCRIPTOR); String _result = this.sayHello(); reply.writeNoException(); reply.writeString(_result); return true; } } return false; }
下面看看service的代码
public class TestService extends Service { private static final String TAG = "MainActivity"; private static class MyService extends Stub { public MyService() { super(new CommonBinder()); } @Override public String sayHello() throws RemoteException { Log.e(TAG, "sayHello"); return "hello"; } } @Nullable @Override public IBinder onBind(Intent intent) { Log.e(TAG, "onBind " + intent, new Exception()); return new MyService().asBinder(); } @Override public boolean onUnbind(Intent intent) { return super.onUnbind(intent); } }
好了,到此为止了。是不是很酷呢。我们的Service可以不用是Binder了! 完完全全就是个桩(Stub),是不是很酷呢。
相关推荐
以下是一些基于“android面试题目+2份+对大家有个测试”主题的关键知识点,这些内容可能会出现在某公司的Android面试题或者练习题中: 1. **Android基础知识** - **Android系统架构**:包括Linux内核层、硬件抽象...
以上是2014年Android面试中可能涉及的一些重要知识点,随着Android技术的不断发展,面试题目的覆盖面也在不断扩大,如Android Jetpack组件、Kotlin语言特性、MVVM架构等都成为近年来的热门话题。持续学习和跟踪最新...
《Android面试大全》是针对Java基础和Android技术的面试指南,涵盖了从基础知识到进阶技能的广泛内容。这本书旨在帮助Android开发者系统性地复习和掌握面试中可能遇到的关键知识点,以便在求职过程中表现出色。 ...
【Android面试笔试题详解】 Android作为全球最大的移动操作系统,其开发者需求旺盛,面试竞争激烈。以下是一些核心的Android知识点,这些题目在许多面试中都可能遇到,它们涵盖了基础概念、编程技巧、性能优化以及...
在Android面试中,掌握核心知识点是至关重要的。以下是一些基于题目所提及的要点的详细解答,帮助你在面试中表现出色: 1. **点击图标启动A程序与B程序跳转到A程序的区别**: 当用户点击应用图标启动A程序时,这是...
本文档是一本关于Android面试的题集,汇集了500道可能出现在Android开发工程师面试中的题目。涉及的知识点包括了Android基础知识、核心概念、系统架构、组件用法、数据存储、网络通信、设计模式、内存管理、缓存机制...
2011android面试题目及其答案大全.rar Android面试题集锦 (陆续更新)(最新2012-6-18) 【eoeAndroid Android相关的面试题最强汇总】 ZTE—adroid笔试题附答案版 iceskysl: 说说我招聘android技术人员的思路 史上...
"Android经典面试题大全"集合了多家知名企业的面试题目,旨在帮助求职者更好地准备面试,提高获得理想职位的机会。以下是一些重要的Android知识点,这些内容可能在面试中被问到。 1. **Android体系结构**: - 深入...
在Android开发领域,笔试和面试是评估求职者技术能力的重要环节。这份"android笔试面试题"的压缩包可能包含了各种常见的技术问题,旨在帮助求职者准备这些挑战。下面,我们将详细探讨这些题目可能涵盖的知识点。 一...
【Android实例】面试题集.zip包含了丰富的Android开发相关的面试题目,是准备Android面试的重要参考资料。以下将对其中可能涵盖的知识点进行详细的解析。 1. **Android基础知识** - Android系统架构:了解Android...