首页 > 系统 > Android > 正文

android developer tiny share-20170220

2019-11-06 10:03:30
字体:
来源:转载
供稿:网友

今天讲android AIDL的“实现接口”这一步,会讲在../app/build/generated/source/aidl/debug/com/zheng3stone/service下生成的AIDL对应的java类的结构和含义,比如Stub抽象类,asInterface方法。另外,还会讲下AIDL涉及的多进程、多线程的相关规则。

以下是android developer官网关于“实现接口”的讲解。

2. 实现接口

当您开发应用时,Android SDK 工具会生成一个以 .aidl 文件命名的 .java 接口文件。生成的接口包括一个名为 Stub 的子类,这个子类是其父接口(例如,YourInterface.Stub)的抽象实现,用于声明 .aidl 文件中的所有方法。注:Stub 还定义了几个帮助程序方法,其中最引人关注的是 asInterface(),该方法带 IBinder(通常便是传递给客户端 onServiceConnected() 回调方法的参数)并返回存根接口实例。 如需了解如何进行这种转换的更多详细信息,请参见调用 ipC 方法一节。如需实现 .aidl 生成的接口,请扩展生成的 Binder 接口(例如,YourInterface.Stub)并实现从 .aidl 文件继承的方法。以下是一个使用匿名实例实现名为 IRemoteService 的接口(由以上 IRemoteService.aidl 示例定义)的示例:

PRivate final IRemoteService.Stub mBinder = new IRemoteService.Stub() {    public int getPid(){        return Process.myPid();    }    public void basicTypes(int anInt, long aLong, boolean aBoolean,        float aFloat, double aDouble, String aString) {        // Does nothing    }};现在,mBinder 是 Stub 类的一个实例(一个 Binder),用于定义服务的 RPC 接口。 在下一步中,将向客户端公开该实例,以便客户端能与服务进行交互。在实现 AIDL 接口时应注意遵守以下这几个规则:

由于不能保证在主线程上执行传入调用,因此您一开始就需要做好多线程处理准备,并将您的服务正确地编译为线程安全服务。默认情况下,RPC 调用是同步调用。如果您明知服务完成请求的时间不止几毫秒,就不应该从 Activity 的主线程调用服务,因为这样做可能会使应用挂起(Android 可能会显示“application is Not Responding”对话框)— 您通常应该从客户端内的单独线程调用服务。您引发的任何异常都不会回传给调用方。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表