Aidl Lite

由于嘴贱,立了个flag...
And thanks for this flag ...
To be continued...

Aidl

1)快速上手

  1. JavaBean
    首先,先写一个JavaBean备用
    PS:该文件不要同AIDL文件放置同一个包下,否是运行会提示找不到该类


    Book.java
  2. JavaBean.aidl
    然后在开始我们新建我们的AIDL文档前,先新建一个与上面JavaBean同名的AIDL文件,既Book.aidl,并在其中声明我们的Book对象

    Book.aidl

    并且该文件需要同上面的JavaBean文件在AIDL下放至于相同的位置,应该是IDE 解析的时候会自动去相同路径下查询,算是一种映射吧,因为待会Sync项目后source下会自动生成java代码,import引用的是aidl路径下的Book.aidl,而这则是由实现了Parcelable的Book.java映射过去的,所以这中间路径需保持一致,不然锁链就断了 (待研究)
    278511509262463_.pic_hd.jpg

  3. AIDL
    最后我们开始新建真正所要用的AIDL对象:BookManager.aidl,并在其中写入接口函数
    在我这小菜鸟现有的理解中,可以暂且将AIDL作为接口来看待,但不同于接口的是
    要注意:

    • 在AIDL文件中使用自定义的JavaBean对象(或非默认数据类型),都必须要在文件中显式地导入进来,正如注释所写的:在此用导入语句来声明任何非默认类型;
    • 并且别忘了对象参数的类型定义,既in/out/inout

    不然会导致第四步的Sync Project的时候报错......(惨痛经历)


    Aidl
  4. Sync Project with Gradle Files
    至此,在AS中点击Sync Project同步下项目,编译器将自动根据我们的AIDL文件生成同名的.java文件(若这里忘了同步,则在后续代码的调用将不会有快捷提示了)
    生成的.java路径(Project模式下):


    image.png
  5. Service
    由于我们的AIDL是跟Service配合使用的,所以我们就接着在Service中创建并调用,具体如下
    由于AIDL也是Binder的子类(有点忘了,我后续确认下嘿嘿嘿),所以只要通过binder新建个aidl的对象,然后自然就会重写我们aidl里的方法(这也是为什么我暂且将其作为接口看待的原因)


    Service

    然后记得在onBind()函数中将上述myBinder返回即可,至此Service部分就写完了

  6. Activity
    最后是我们的Activity,Activity部分也挺简单的
    我们只需要在onServiceConnected()中通过调用AIDL.Stub.asInterface(),并将该方法中的IBinder型参数传入即可,这样我们就获取到了我们的AIDL对象,而后续的事也就是通过该对象来调用之前写在里面的方法罢了


    Activity
  1. 结果


    image.png

2)添加监听

  1. 新建监听aidl文件:BookListener.aidl,并在其中完善监听接口


    BookListener.aidl
  2. 在BookManager.aidl中也添加注册和解绑监听的方法,记得需要显式导包


    BookManager.aidl
  3. Service中重写AIDL中两个新添加的方法以实现注册和解绑,并且模拟添加书籍


    重写方法

(模拟添加书籍可参照开发艺术探索P78)


模拟持续添加book
  1. Activity中获取BookListener的对象,并重写方法打印,然后记得调用bookManager.registerListener()即可


    2017-10-27-09-36-41.jpg

    2017-10-27-09-37-06.jpg
  2. 结果:
    可以从log里看到,当Activity销毁调用unregisterListener()时,无法找到之前注册的listener


    Log

PS:若Service和Activity在同一个进程的情况下,则不会有上述现象

3)使用RemoteCallbackList

由于我们的Service和Activity是在两个进程,而对象不能跨进程传输,而多进程跨进程的话,无法调取到同一对象,因为对象不能跨进程传输,所以Binder会把客户端传递过来的对象重新转换生成一个新的对象,
故若多进程时解绑,需要使用RemoteCallbackList

  1. 将listenerList类型从List改为RemoteCallbackList


    RemoteCallbackList
  2. 重写binder中的注册和解绑函数


    修改注册解绑方法

    需要注意的是RemoteCallbackList的size可以通过beginBroadcast()获取,但需要在调用后,调用finishBroadcast()


    RemoteCallbackList.begin
  3. 结果


    Log

项目地址:

遗留

  • AIDL里的in,out,inout三种类型
  • 由于上面只是知其然,还需要看官方文档知其所以然下

Refrence

  • 《Android开发艺术探索》
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容