当前位置: 代码迷 >> 综合 >> Android面试知识总结
  详细解决方案

Android面试知识总结

热度:75   发布时间:2024-02-08 10:32:30.0

2020-08-05:ZK:初

1.AIDL
2.handler
3.A Activity 起 B Activity ,及Back后生命周期。
4.ANR
5.内存泄漏
6.cotentprovider 怎么用
7.startservice 和 bindService 生命周期区别,如果bind的A Activity销毁了 服务怎么样
8.java类加载: 静态成员 ,静态代码块,构造方法。非静态成员 方法顺序
9.事件分发后如何中断处理。
10.c++ :和::区别。

问题答案整理:
1.AIDL:
使用:
服务端开发步骤:
1.创建一个aidl文件夹,NEW->FOLDER->AIDL FOLDER
2.创建一个AIDL 文件,两种创建方式:
2.1 创建一个Java接口文件,删掉修饰符,将文件后缀名改为aidl
2.2 NEW->AIDL->AIDL FILE
3.rebuild project,检查是否生成对应的Java文件,app->build->generated->source->aidl->debug->FILE JAVA
4.创建一个Service,在Service中定义内部类,继承自AIDL所生成的Java类中的Stub类,并实现该类中的方法,并把这个内部类的实例作为onBind方法 返回值。
5.在清单文件中注册Service,注意添加exported属性和action

客户端开发步骤:
1.将服务端的AIDL文件夹拷贝至客户端的main文件夹下
2.rebuild project,检查是否生成对应的Java文件
3.客户端的activity里连接远程服务 实现aidl通信
创建ServiceConnection实例,实现未实现的方法1.onServiceConnected()回调中mMyRemoteService =MyRemoteService.Stub.asInterface(IBinder)方法返回服务端引用,客户端就可以通过mMyRemoteService 来与服务端通信,调用服务端方法。

原理总结:
通过对AIDL的分析,我们发现原来这一切围绕着Binder有序的展开
AIDL通过Stub类用来接收并处理数据,Proxy代理类用来发送数据,而这两个类也只是通过对Binder的处理和调用。
所谓的服务端和客户端,我们拆开看之后发现原来竟是不同类的处理
Stub充当服务端角色,持有Binder实体(本地对象)。
1.获取客户端传过来的数据,根据方法 ID 执行相应操作。
2.将传过来的数据取出来,调用本地写好的对应方法。
3.将需要回传的数据写入 reply 流,传回客户端。
Proxy代理类充当客户端角色,持有Binder引用(句柄)。
1.生成 _data 和 _reply 数据流,并向 _data 中存入客户端的数据。
2.通过 transact() 方法将它们传递给服务端,并请求服务端调用指定方法。
3.接收 _reply 数据流,并从中取出服务端传回来的数据。

 

  相关解决方案