Android单个app的aidl跨进程调用

先介绍背景:最近在做一个app,app里有一个组件,由于该组件需要操作sqlite数据库,因此组件其实是依赖于context的,而且组件初始化比较耗时(有一些文件要解压读取),所以我们希望这个组件在一开始初始化好之后就可以一直用着。我们的app有一个功能是调用系统相册应用选取照片,在调用之后发现我们自己的app会被系统回收(我们的app内置了一个in-memory database,因此挺占内存的),组件为null导致app crash。这个问题在RAM较小(1G RAM以下)和系统较低(Android4.4及以下)的手机上出现频繁,不得不去解决。


首先分析问题,为什么会被crash,我们知道在android的进程优先级中(进程优先级可自行在android官方文档找到),前台app,前台service的优先级是最高的,即系统不会去回收当前用户正在交互的activity或者是service,然而当我们在调用系统相册应用时,我们的app变成了后台进程,系统发现内存不够用了便会去回收我们的app。而且由于我们的组件是和app紧耦合在一起的(在同一个进程中),因此当app被回收的时候,这个组件也将一同被回收。


然后尝试解决问题,首先是优化app内存的使用,其次是将组件放置到一个前台service中,发现依然会被系统回收。接着我们只能试试在将组件放在一个单独的service process中,提升service优先级尽量避免被杀死。网上教程大部分都是两个app之间的跨进程调用,找到一篇单个app的跨进程调用却是用非常麻烦的handler messenger机制实现,官方文档也很模糊,因此本文说的就是如何在单个app中实现aidl跨进程调用。


首先是项目结构

如果需要想要使用aidl远程调用,需要声明aidl接口,在本例中IMyAidlInterface.aidl就是接口文档,接口文档如何写,支持什么类型请参考android官方文档,下面给出我的例子,里面import的两个自定义类型会在稍后解释。

package sample.adam.aidlsample;

// Declare any non-default types here with import statements
import sample.adam.aidlsample.model.MyObject;
import sample.adam.aidlsample.model.MySubObject;

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */

    // The "in" tag means the data flow can just be from client to server, the object of the client won't be changed
    void setObject(in MyObject obj);

    // The "out" tag means the data flow can just be from server to client,
    // the object of the client is commonly null, the client can notices the changes of the object
    void getObjectMethod1(out MyObject obj);

    MyObject getObjectMethod2();

    // There is also "inout" tag which means the flow is two-way, either client or server can notice the changes of the object
}

其次,我的接口参数为自定义类型,若想要aidl传递自定义类型,则该类型一定要实现Parcelabel接口,而且需要定义该类型的aidl文件且目录结构要一致。

下面具体介绍,首先是MySubObject类型:


                
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值