专业技能描述
- 扎实的java语言基础,熟练掌握面向对象思想。
- 熟悉java中常用的设计模式
- 单例模式:在内存中保持一个对象
- 工厂模式:该模式的主要功能是统一提供实例对象的引用
- 建造模式:该模式其实就是说,一个对象的组成可能有很多其他对象一起组成,比如说,一个对象的实现非常复杂,有很多的属性,而这些属性又是其他对象的引用,可能这些引用又包括很多对象的引用。封装这些复杂性,就可以使用构造模式。
- 观察者模式:发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能自动更新自己。
- 熟练掌握Android四大组件,常用的布局文件和控件,自定义控件等。
掌握Activity和fragment混合使用编写展示页面。
fragment生命周期:onAttach-->onCreate-->onCreateView--->onActivityCreate-->onStart-->onResume-->onPause-->onStop-->onDestroyView-->onDestory-->onDetach 动态的添加、替换和移除某个Fragmnent replace使用: FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); mWeixin = new ContentFragment(); transaction.replace(R.id.id_content, mWeixin); transaction.commit(); transaction.add() //往Activity中添加一个Fragment transaction.remove()//从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈,这个Fragment实例将会被销毁 transaction.replace()//使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体 transaction.hide()//隐藏当前的Fragment,仅仅设为不可见,并不会销毁 transaction.show()//显示之前隐藏的Fragment detach()//会将view从UI中移除,和remove()不同,此时Fragment的状态依然由FragmentMananger维护 attach()//重建View视图附加到UI并显示 FragmentTransaction.addToBackStack(String)//添加一个Fragment事务到回退栈 在commit()前调用
熟悉android屏幕适配
- 在写布局文件的时候尽量使用wrap_content、match_parent、weight 而不是使用硬编码写死控件的尺寸,这样视图就会相应仅使用自身所需的空间或展开可以填满可用的空间,可以让布局正确适应各种屏幕尺寸和屏幕方向。
- 为了适配小屏幕对内容,对内容比较多不是使用listView展示的页面最好在外部采用ScrollView.
- 代码适配,根据需求在代码中动态计算控件的尺寸。
- 图片适配:切多套图放在res目录下的不同资源文件夹下,为不同像素密度的手机适配
- 布局文件适配:加载不同的布局文件达到适配效果。比如创建多个layout(比如:layout-1280x720、layout-800x480)文件夹用于存放不同像素密度手机所需的布局文件
- 使用限定符:例如:layout-large(系统会在属于较大屏幕比如7英寸或更大的平板电脑上选择此布局,系统会在较小的屏幕上选择其他无限定符的布局)
使用最小宽度限定符
res/layout/main.xml: 单面板布局 res/layout-large: 多面板布局 res/layout-sw600dp: 多面板布局 后两个文件是相同的,因为其中一个用于和Android3.2设备匹配,而另一个则是为了使用较低版本Android的平板电脑和电视准备的。
使用布局别名
res/layout/main.xml,单面板布局 res/layout/main_twopanes.xml,双面板布局 后两个文件的内容相同,但它们并未实际定义布局。它们只是将 main 设置成了 main_twopanes 的别名。由于这些文件包含 large 和 sw600dp 选择器,因此无论 Android 版本如何,系统都会将这些文件应用到平板电脑和电视上(版本低于 3.2 的平板电脑和电视会匹配 large,版本高于 3.2 的平板电脑和电视则会匹配 sw600dp)
- 使用自动拉伸位图(.9图)
- 使用非密度制约像素(使用dp、sp代替px)
设计图尺寸:以高分辨率作为设计大小,以1280*720 和1960*1080 作为主要分辨率进行设计。
熟悉android中的handler消息传递机制
熟悉android中的事件分发机制
- 熟悉android手势识别技术
- 熟悉自定义控件
- 熟悉android中常用的性能优化技术
熟悉图片处理技术(图片虚化、加载大图片、图片lrucache、diskCache、图片裁剪、图片合成、图片加马赛克、图片滤镜、图片压缩、图片加云标签)
我对LruCache的理解,lruCache里面维护了一个linkHashMap,里面存放的是对对象的强引用,如果需要某个对象就从这个集合中取如果该集合中没有就创建一个添加进去,如果超出了该集合的最大容量值,就运用lru(最远最少使用算法)算法将对象移除回收。
熟练使用阿里云的oss图片处理系统和七牛的图片处理系统
- 熟练使用leakCanary检查分析app的内存泄露情况,及时修正。
- 熟悉一些常用的第三方框架及开源库(比如百度sdk、微信、微博、bugtags、slidingMenu、pullToFresh、otto、ImageLoader、Picasso、fresco、androidannotation、butterKnife、Gson、fastJson、simpleJson)
熟悉JNI技术
JNI java本地开发接口,JNI是一种协议,这个协议用来沟通 java代码和外部的本地代码(c/c++),通过这个协议java代码可 以调用外部的c/c++代码,外部的c/c++代码也可以调用java代码 使用过程: JAVA代码中写声明native方法 创建jni目录,编写c代码,方法名字要对应 编写Android.mk文件 Ndk编译生成动态库 Java代码load动态库,调用native代码
- 熟悉AIDL技术
- 熟悉Gradle脚本
- 熟练使用svn和git版本控制工具(比较喜欢使用git)
了解Https
问题回答:Https是以安全为目标的Http通道,简单的讲就是Http的安全版,即在Http下加入了SSL层,Http的安全基础是SSL层; 我在项目中使用Https加密传输时,在客户端与服务端第一次握手的时候选择RSA(非对称加密算法)加密,通过握手加密对称加密密钥,在以后的数据传输过程中使用对称加密;我们没有选择在整个过程中都使用非对称加密,是因为非对称加密算法的比较复杂,性能比较低。如果感觉传输过程中对称加密算法还是不是很安全,可以准备多套密钥,然后将每次传输的的加密类型放在请求头或响应头中,这样每次都可以根据类型来选择对应的密钥。或者对密钥进行二次加密,这样也可以增强传输过程中内容的安全性。 RSA加密:A和B进行加密通信时,B首先要生成一对密钥。一个是公钥,给A,B自己持有私钥。A使用B的公钥加密要加密发送的内容,然后B在通过自己的私钥解密内容。 以安全为目标的Http通道,简单讲是Http的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL. SSL:安全套接字层 TLS:传输层安全协议,用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。 1999年SSL因为应用广泛,已经成为互联网上的事实标准。IETF就在那年把SSL标准化。标准化之后的名称改为TLS RSA性能是非常低的,原因在于寻找大素数、大数计算、数据分割需要耗费很多的CPU周期,所以一个的HTTPS连接只在第一次握手时使用非对称加密,通过握手交换对称加密密钥,在之后的通信走对称加密。
20.掌握断点续传
- 断点续传需要在下载过程中记录每条线程的下载进度
- 每次下载开始之前先读取数据库,查询是否有未完成的记录,有就继续下载,没有则创建新记录插入数据库
- 在每次向文件中写入数据之后,在数据库中更新下载进度
- 下载完成之后删除数据库中的下载记录
21.线程池原理:
三个变量 count记录当前线程的指针,maxCount记录线程池中的最大线程数目,LinkList 存放异步任务,调用execute()方法,该方法的是增加当前指针的值及count++
while ture 创建线程的线程
AtomicInteger 保证线程同步
AtomicInteger count = new AtomicInteger(0)
if(count.incrementAndGet < maxCount)
线程池中线程的数量:cpu核数+1
联网和读取本地文件不要放到一个线程池中
使用支付宝支付流程图
WeChat支付流程图参考链接
过程描述:
1. 用户在商户App中选择商品,提交订单,选择微信支付
2. 商户后台收到用户支付单,调用微信支付统一下单接口。
3. 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传给App.
4. 商户App调起微信支付
5. 商户后台接收支付通知
6. 商户后台查询支付结果。