面试时间:2019年5月8日
岗位:安卓开发工程师
深圳/3-5年/本科/13-25K
岗位简述:1、熟练掌握Java/Android SDK的使用; 从事华为钱包客户端+NFC客户端的研发工作,可实现银行卡管理,手机支付,NFC支付,公交卡等功能。
2、熟练掌握Android的基本类库、界面设计、数据存储,以及主流设备的适配;
3、熟练掌握Android系统 活动、服务、线程、进程的通信机制;
4、有一年以上工作经验;
一 Android SDK
二 Android基本类库
android.util 涉及系统底层的辅助类库
android.os 提供了系统服务、消息传输、IPC管道
android.graphics GPhone图形库,包含了文本显示、输入输出、文字样式
android.database 包含底层的API操作数据库(SQLite)
android.content 提供了各种数据传输、服务、资源管理
android.view 提供基础的用户界面接口框架
android.widget 显示各种控件如按钮、列表框、进度条等。
android.app 提供高层的程序模型、提供基本的运行环境
android.provider 各种定义变量标准
android.telephony 提供与拨打电话相关的API交互
android.webkit GPhone默认浏览器操作接口
三 数据存储
Android 数据持久化==存储数据的五种方法
https://www.jianshu.com/p/b64ca52d5d41
Android提供的数据存储方式有SharedPreferences, 文件保存,SQLite数据库保存,网络保存和内容提供器
1.SharedPreferences
SharedPreferences是基于XML格式的文件存储key-value格式的数据,数据类型包括字符串,基本数据类型以及序列化的对象
适用于存储一些配置消息.
通过Context调用getSharedPreferences()方法获取SharedPreferences方法获取SharedPreferences对象,再用edit()方法获取Editor对象,对数据进行保存,删除等操作.当editor编辑完成后commit()提交修改
1.1对象序列化方式
1.2多线程多修改数据
2.文件保存
使用Context调用getFileInputStream()获取输入流,调用getFileOutputStream()获取输出流进行读写
3.SQLite
当要插入多条数据的时候,使用for+insert会导致插入一条数据就进行一次磁盘读写,性能低下.如果使用事务就能批量插入数据
使用beginTransaction()开启事务, 使用endTransaction()结束事务, 在调用endStransaction()前, 如果调用了setTransactionSuccessful(), 设置事务操作成功的标记则提交事务, 如果没有则事务回滚
4.ContentProvider
四 设备适配
目前Android最全面、最易懂的Android屏幕适配解决方案
https://blog.csdn.net/xxf377376701/article/details/78925646
五 进程间通信
进程间的五种通信方式介绍
https://blog.csdn.net/wh_sjc/article/details/70283843
5.1管道(无名管道)特点
1)管道的数据只能在一个方向上流动
2)管道只能用于父子进程以及兄弟进程间的通信
3)管道是一种特殊的文件,存在于内存中
当管道建立的时候, 会创建两个文件描述符, fd[0]表示为读打开, fd[1]表示为写打开. 比如父进程保留fd[1], 子进程保留fd[0], 数据就会从父进程流向子进程.反之数据会从子进程流向父进程
5.2
(二) 中软
一 简述四大组件
Activity是Android程序与用户交互的窗口
Service没有界面,在后台完成用户指定的操作(如,音乐播放,下载,复杂计算等)
BroadcastReceiver对外部事件进行过滤,只对感兴趣的外部事件(如当电话呼入,开机时等)进行接收并做出响应
ContentProvider主要用于在不同的应用程序之间实现数据共享的功能
二 UI界面
三 多线程
答:Android中的耗时操作不能再在UI线程执行,不然会导致线程阻塞, 所以就需要多线程的操作,常用的多线程操作包括handler,asyncTask, IntentServer
3.1Handler机制
1)在主线程创建一个handler对象,并复写handleMessage()方法;
2)创建runnable线程,执行耗时操作. 开启一个线程就会开启一个looper, looper初始化的时候会创建一MessageQueue
3)执行完耗时操作,通过handler把消息发送到消息队列中, looper轮询消息队列把消息取出来交给handler处理
4)在一个线程中可以创建多个handler,但是会通用一个MessageQueue, 处理消息的handler只能是发送消息的那个handler
3.2AsyncTask
在UI线程创建AsyncTask实例调用execute()函数. execute方法会调用onPreExecute()方法, 然后由ThreadPoolExecutor实例执行一个任务,这个过程中doInBackground()将被调用执行耗时操作.
如果在doInBackground()调用了publishProgress(), 则InternalHandler实例发送更新进度的消息, 处理消息的时候会调用onProgressUpdate()方法, 让用户在UI线程更新进度
如果遇到异常,InternalHandler实例发送异常消息, 处理消息的时候会调用onCancelled()方法
如果执行成功, InternalHandler实例发送执行成功消息, 处理消息的时候会调用onPostExecute()方法,让用户在UI线程处理结果
3.3IntentService
IntentService在onCreate()方法中单独开启一个线程执行耗时操作, 通过onHandlerIntent()方法执行耗时操作,耗时操作执行完后会自动关闭service
四 socket通信 HTTP网络请求
4.1TCP/IP是传输层协议, HTTP是应用层协议.
Socket是应用层与TCP/IP协议族通信的中间软件抽象层, 应用层和传输层通过Socket接口, 区分来自不同应用程序进程或网络连接的通信, 实现数据传输和并发服务
4.2 Socket连接
socket连接包括客户端socket和服务端socket. 服务端套接字处于等待连接状态,并不定位具体的客户端套接字; 客户端套接字描述服务端的地址和端口,向服务端发送连接请求; 服务端套接字响应请求, 建立一个线程把服务端的描述发给客户端,一旦客户端确认描述,双方就正式建立连接,然后服务端继续处于监听状态, 等待其他客户端套接字的请求
4.3 Socket连接与HTTP连接
创建Socket连接时, 如果指定使用TCP协议进行连接, 该Socket连接就是一个TCP连接。
如果服务器与客户端是Socket连接, 服务器可以直接向客户端推送消息; 如果服务器与客户端是Http连接, 服务器必须等客户端发送请求后才将数据传给客户端
五 广播常用加减密
六 性能优化
七 内存优化
八 设计模式
九 AS开发环境