2019年11月29日
1.产品意识:梳理产品流程,UI标准,上线标准;
2.代码质量:封装,继承,多态;AS的lint工具:https://www.jianshu.com/p/a0f28fbef73f
3.协作开发(gitLib),代码和接口文档一定是内网的,外网容易受攻击。
4.公司场景:入职手续,沟通意识;
2019年11月30日
java基础:
- 基本数据类型:byte,short,int,long,float,double,boolean,char
- 引用数据类型:String
- 拆箱和封(装)箱:Byte,Short,****;
- 修饰符:private,default,protected,public
- 运算符:a++,a--,&&,||,!,&,|
- 数组运算:长度不可变,Arrays.copyof()使用了System.arrayCopy()
- IO流:
- 异常处理:Throwable分为Error和exception;
抛异常:①try-catch-finally;②throws 异常对象
- 封装,继承,多态 自述表达
- ①重写override:方法体,修饰符权限不变或者变大;②重载overload:只有方法名不能变,参数类型必须改变
- 构造方法:①默认无参构造方法;②只包含有参构造,子类需要重写;③子类实现无参构造方法,默认调用super();
- 接口interface:方法默认public abstract 无方法体;属性默认public final static
- 抽象类abstract class:可以包含普通方法;可以不写抽象方法;抽象方法必须abstract修饰,不能private;
- 内部类:默认持有外部类对象,可以调用外部类所有方法可属性,new对象必须先new外部类对象;
- 静态内部类:跟普通类一样。
- 集合Collection:Set去重(HashSet,TreeSet(排序));List(ArrayList,LinkedList);Map(HashMap,TreeMap,ConcurrentHashMap,LinkedHashMap);dictionary(HashTable)
- 泛型:T,Data,Param;写法<T>,<? extends Object>
- 序列化:Serializable,Parcelable;把java对象编程可存储的字节码
- 反射:Class.fromName("包名+类名");Field,Method,Constructor;若要调用private修饰的变量或者方法,需要调用setAccessible(true);
- 线程:Runnable:调用run方法运行在当前线程;Thread:调用start()开启子线程;sleep()睡眠;Callable线程返回值
- 同步异步:关键字:synchronized,volatile;锁:Lock(ReentrantLock);wait和notify;await()和async();
2019年12月09日
第三方SDK:
地图定位:(国内)百度地图,腾讯地图,高德地图;(国外)谷歌地图
统计:友盟统计,百度统计
平台:微信开放平台,百度开放平台,阿里开放平台
推送:百度推送,极光推送,环信,腾讯信鸽
bug平台: 腾讯bugly ,bugHD
内测版本平台:fir.im,七牛,蒲公英
加固平台:腾讯加固,网易易盾,testin
测试平台:百度云测,testin云测
第三方框架:
数据库框架:ORMLite, LitePal, GreenDao(加密,缓存),ROOM
网络框架:OKHttp,volley,Retrofit2
结构化编程:RxJava-android方向;
图片框架:Imageloader,Glide,Fresco,Picasso
注解初始化框架:butterknife;
事件数据传递:EventBus
权限申请框架:EasyPermission,ABCPermission,RxPermissions
通用快速开发框架:Afinal框架,XUtils,ThinkAndroid,LoonAndroid,UltimateAndroid,androidannotations,KJFrameForAndroid,AndroidCommon,Andbase
自定义控件关键字:
Filp(翻转翻页效果)
https://github.com/wajahatkarim3/EasyFlipViewPager
https://github.com/openaphid/android-flip
吸顶效果
https://github.com/flowerthorn/FixedTopBarDemo
https://github.com/yujintao529/TopDecoration
https://github.com/Lichenwei-Dev/StickHeaderView
阻尼效果
https://github.com/xiaoyanger0825/Parallax
https://github.com/jeasonlzy/PullZoomView
加载(圈,条,效果,进度条)
https://github.com/zzz40500/android-shapeLoadingView
https://github.com/PoplarTang/FancyProgress
https://github.com/zhangyuChen1991/ZYDownloading
https://github.com/youmu178/ArcProgressBar
https://github.com/AnliaLee/Progressbar
seekbar(加载条)
https://github.com/search?l=Java&q=seekbar&type=Repositories
2019年12月18日
- 线程间的通信:
- Handler+子线程
- AsyncTask 异步任务
- EventBus 事件总集
使用RxJava实现线程间通信
Thread+ Runnable 子线程没有返回值
Future+ Callable 子线程有返回值
- 进程间的通信(IBinder机制https://www.cnblogs.com/xinmengwuheng/p/7070167.html):
- 广播
- ContenProvider(间接)
- File(间接)
- Intent 隐式跳转 (Acitivty,Service)
- AIDL+ServiceConnection
2019年12月27日
1.tcp三次握手和四次挥手
三次握手:
客户端发送syn码到服务器,询问是否建立连接;
服务器返回syn+ack码到客户端,ack码标志着服务器响应此连接;
客户端把ack码发回给服务器,表示此时可以连接;
四次挥手:
客户端发送fin码到服务器,询问是否结束连接;
服务端先返回ack码到客户端,确认是否结束;
服务端在返回fin码到客户端,表示同意结束连接;
客户端发送ack码到服务端,结束连接,释放资源;
为啥一定需要三次握手,而不是两次握手?
防止已失效的连接请求又传送到服务器端,因而产生错误,保证连接的可靠性
https://www.cnblogs.com/pengmn/p/10836784.html
为啥一定是四次挥手,而不是3次挥手?
https://www.cnblogs.com/liuyu7177/p/11428914.html
为啥客户端会主动发起挥手?
因为http在read读流过程结束的时候,接收到数据流标识为-1,意思是数据流末尾标识,则需要主动告诉服务器我已经读取结束。
2.handler机制
hanlder:需要传入Looper,默认情况下会获取当前线程的Looper,Looper.myLooper()获取当前线程的Looper。
Looper:包含MessageQueue,Looper的loop()对消息队列进行轮询,死循环,但是消息队列的next()会阻塞,为啥不阻塞线程,因为一个线程只能有一个Looper,如果是主线程的Looper,activity的生命周期都是依靠Handler中Looper来进行的,所以有消息肯定会及时处理,不会发送ANR现象。
MessageQueue:不断返回已经超过当前时间的Message;
Message:保存数据
int what
int arg1
int arg2
Object obj(可以存放任何基本类型和引用类型的数据)
发送消息方法:
sendEmptyMessage()
sendEmptyMessageDelay()
sendEmptyMessageAtTime()
sendMessage()
sendMessageDelay()
sendMessageAtTime()
3.支付流程
4.加载大图方案:BitmapRegionDecoder和BitmapFactory的了解
BitmapRegionDecoder返回一个左上右下坐标矩形区域的bitmap,然后可以根据手势移动,改变坐标,然后返回不同的bitmap,然后进行实时绘制就可以了。
5.OKHttp原理
基本概念
设计模式:
责任链模式:拦截器链
单例模式:线程池
观察者模式:各种回调监听
策略模式:缓存策略
Builder模式:OkHttpClient的构建过程
外观模式:OkHttpClient封装了很对类对象
工厂模式:Socket的生产
Dispatcher:调度器,分发器;包含最大请求数量64,同时请求不同的域名请求不能超过5个,等待队列readyAsyncCalls,运行队列runningAsyncCalls,同步队列runningSyncCalls
整体流程
(1)通过OkhttpClient创建一个Call对象,并发起同步或异步请求时;
(2)Dispatcher对所有的RealCall(Call的具体实现类)进行统一管理(两个队列),并通过execute()及enqueue()方法对同步或异步请求进行处理;
(3)execute()及enqueue()这两个方法会最终调用RealCall中的getResponseWithInterceptorChain()方法,从拦截器链中获取返回结果;
(4)拦截器链中,依次通过RetryAndFollowUpInterceptor(重定向拦截器)、BridgeInterceptor(桥接拦截器)、CacheInterceptor(缓存拦截器,使用于DiskLruCache)、ConnectInterceptor(连接拦截器)、CallServerInterceptor(网络拦截器)对请求依次处理,与服务的建立连接后,获取返回数据,再经过上述拦截器依次处理后,最后将结果返回给调用方。
连接池原理
Okhttp支持5个并发KeepAlive,默认链路生命为5分钟(链路空闲后,保持存活的时间),连接池有ConectionPool实现,对连接进行回收和管理。
网络优化方面:
(1)内置连接池,支持连接复用
(2)支持gzip压缩响应体
(3)通过缓存避免重复的请求
(4)支持http2,对一台机器的所有请求共享同一个socket
2019年12月28日
1.线程的状态切换,创建线程的区别
创建方式:Thread+Runnable; Future+Callable
状态:new--->runnable---->running----->dead
Runnable:无返回值,Runable的run()调用之后,在哪个线程调用,则在哪个线程运行。
Thread:配合Runnable使用;
- start()内部将本线程对象传递给JNI接口,创建线程进行cpu执行。
- sleep() 交出cpu的执行权,阻塞线程,不会释放锁,所以一旦sleep()则只能等待,因为其他线程无法访问对象锁。
- Object的wait方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。
- yield方法会让当前线程交出CPU权限,让CPU去执行其他的线程,不会阻塞线程,改变线程状态为runnable就绪
- join()子线程执行结束,才会继续join()之后的执行语句
- interrupt方法可以中断处于阻塞状态的线程;但非阻塞线程只能通过手动编写判断isInterrupt()方法进行主动停止。
- stop和destory方法已经被废弃。
2.java线程池的了解
参数分析:
- corePoolSize: 核心线程数
- maximumPoolSize:最大线程数
- keepAliveTime:非核心线程最长空闲时间,超过这个时间,空闲的非核心线程会被回收,设置allowCoreThreadTimeOut=true,同样也会作用在核心线程中。
- unit:时间单位
- workQueue:存储将被execute方法执行的Runnable任务的队列
- threadFactory:线程工厂,创建新线程
四种线程池:
- FixedThreadPool:固定数量的线程池,核心线程数和最大线程数相同,使用链表阻塞队列
- CachedThreadPool:缓存线程池,核心线程数为0,最大线程数为Integer.MAX_VALUE,非核心线程等待时间为60s,使用SynchronousQueue队列
- SingleThreadPool:单例,核心和最大都是1,使用链表阻塞队列LinkedBlockingQueue。
- ScheduledThreadPool: 定时延时执行,使用DelayedWorkQueue
执行顺序:
(corePoolSize -> workQueue -> maximumPoolSize)
- 当未超过核心线程数时,就直接创建一个核心线程去执行任务。
- 当超过核心线程数,就将任务加入到workQueue的任务队列中等待
- 当任务队列中任务添满时候,在不超过最大线程数的情况下启动线程去处理任务
- 当线程数量超过最大线程数时,RejectedExecutionHandler对象通知调用者
阻塞队列分类
- ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
- LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
- PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
- DelayQueue:一个使用优先级队列实现的无界阻塞队列。
- SynchronousQueue:一个不存储元素的阻塞队列。
- LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
- LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
队列:
- 有界:put和take操作是阻塞的,可是设置队列的长度。
- 无界:不能设置队列长度,put不会阻塞,底层是CAS无锁编程
拒绝策略:
- 直接丢弃(DiscardPolicy)
- 丢弃队列中最老的任务(DiscardOldestPolicy)
- 抛异常(AbortPolicy)
- 将任务分给调用方来执行(CallerRunsPolicy),例:主线程中给线程池中添加线程,但是超过了最大数量,则直接交给主线程来执行。
3.java 集合的了解,set,list,map
HashTable:Dictionary字典结构,线程安全,但是执行效率过于慢
数据结构介绍:1.8之前是数组+链表,Entry结构;1.8之后是数组+链表+红黑树,Node结构
HashMap参数
- 默认初始长度为16;也就是数组长度,默认最大容量为2的30次方
- 加载因子为0.75:也就是数据长度达到容量的0.75倍,进行长度扩充。
- 链表默认最大长度为8,超过8位需要转化红黑树。
- 树转化链表最小长度为6:反树化
- 执行树形化之前,会先检查数组长度,如果长度小于64,则对数组进行扩容
key hash算法得到数组位置,进行扩展;数组扩容16到32的过程实际上也就是二进制第五位0和1的运算而已。
ConcurrentHashMap线程安全,和HashTable之间明显的区别是全局操作锁和分段操作锁。
ArrayList
- 初始容量为10,扩容公式:length*3/2+1;判断数组长度加1是否小于当前最小容量,如果不小于,则扩容1.5倍
- 使用Arrays.copyof对数组进行拷贝,使用System.arrayCopy()方法
CAS原子性:EVN:原值,预期值,新值
Unsafe 非安全,原子性操作
Atomic原子类,Adder类
4.自定义view
绘制过程:WindowManager---window---activity+decorView-->xml布局--->view--->onMesure----->onLyaout--->onDraw
Mesure测量三种模式:
- EXACTLY:精准模式,当控件的layout_width和layout_height属性指定为具体数值或match_parent时
- AT_MOST:最大值模式,当空间的宽高设置为wrap_content时。
- UNSPECIFIED:未指定模式,View想多大就多大,通常在绘制自定义View时才会用。
5.事件分发机制
Activity-dispach-->ViewGroup-dispach-->ViewGroup-onIntercept-->View-dispach-->View-onTouch-->ViewGoup-onTouch-->Activity-onTouch
2019年12月30日
1.apk瘦身方式
2.图片框架对比:ImageLoader,Glide,Picaso,Fresco
3.Fragment和Activity的了解
4.app适配:屏幕,版本,语言等
5.Service,BroadcastReceiver
2019年12月31日
1.你了解的设计模式(至少三种)
2.断点续传和下载
3.数据安全
4.处理检测内存泄漏
5.项目架构和mvp
2019年2月2日
1.Activity生命周期,fragement生命周期,Activity启动方式和介绍,ActivityA进入ActivityB执行的生命周期,ActivityB返回ActivityA执行的生命周期。fragment有几种使用方式,分别使用哪些方法。
2.自定义View绘制流程请详细口述。View的事件传递原理请详细口述。
3.QQ语音会议,先让大家熟练熟练,确定每天开会时间为早晨11点。
4.收心:工作紧迫度,时间紧迫。注意身体安全。
5.主要内容:每天面试安排。
6.今天带大家熟悉一下面试问题,百度等等。
2019年2月3日
1.熟悉腾讯云会议
2.随机提问进行测试
3.开始随机面试题。
2019年2月11日
1.微信QQ有无网络自动请求是怎么做的:
IM即时通信--->socket套接字--->BroadcastReceiver(监听系统wifi,移动网络,信号改变的广播)--->重启消息订阅socket
全局静态Listener回调;EventBus事件发送通知。
2.涛哥 我想知道个动态权限申请的方案 我会申请 我想知道有什么方案
默认的请求权限方式过于繁琐,有没有简单的方式
3.内存优化工具①Memory Analyzer----DDMS(Monitor)②Android Lint 工具 ③LeakCanary工具
代码优化:https://www.tuicool.com/articles/QB32Yf
减少大对象的使用:String对象可以拼接无限大的数据,Bitmap对象
资源res优化:图片压缩,减小view层级,尽量使用.9图
4.进程间通信方式:
2019年2月12日
1.更换直播软件,晚上通知大家。
2.手写冒泡排序和选择排序。“weifwweuvwacoaioc“包含多少个字母,每个字母出现多少次。
Android程序:A页面进入B页面,B页面包含列表,点击列表之后,关闭B页面,把列表展示的值回传给A页面并展示或者提示出来。(ArrayAdapter)
3.视频面试。
4.面试题:
- 离职原因:不能说之前公司不好,不能说自己和同事的关系不好。公司项目不做了,公司运营状况不好,老板不打算做这个公司了;公司有好几个月没法公司了;公司项目停滞,已经两个多月没做什么工作了,为了个人发展,我想出来看看机会。
- 薪资:如果公司开10-15,那么你要的去中间值13,但是需要根据实际面试情况来定。其他情况,按照自己的要求来。上家公司工资在你们这个技术水平,一般低1-2K就可以了,别太低,不然这家公司工资要不上去。
- 进程保活(应用后台运行不被关闭,Service运行):应用生态圈(①腾讯系:微信QQ管家企业微信,②阿里系:饿了么支付宝淘宝天猫飞猪微博优酷 ③wifi万能钥匙平安银行民生银行智行火车票携程汽车之家③头条系:抖音西瓜懂车帝头条):各大公司老总基本上在投资圈和创业圈都是朋友关系,只有产品上的相互扶持,互相使用Intent打开自己白名单中的对方应用的Service; 小公司由于没有生态圈,所以应用要做到进程保活只能通过某些技术手段,但也不一定保活。一些技术手段包括:①Service中写死循环子线程,②so库新建守护进程,但是一般非root手机没有权限新建进程。
- 如何保证推送到达率:加入说原有的推送到达率为20%,那么手机厂商通道到达率基本可以保证60%,部分推送有针对的手机厂商通道,可以保证消息到达率
- 怎么在原本消息(不一定是推送,也可能是适当的时候http请求)到达率基础上再提高呢,还有消息点击率:
- 服务器第一次推送到客户端,如果接收到消息,客户端请求服务器告知接收到。
- 客户端需要保存推送的信息。
- 服务器把剩余没有收到的用户进行二次消息推送,重复1,2过程。
- 每次打开应用的时候,使用http请求的方式获取一次新消息,重复2过程。
- 消息去重,由于我们接到消息使用方式无非就是两种:直接展示在页面上或者弹出通知
- 领导要求消息到达率是多少,你需要有一个预估,不要去逼问领导需要什么样的数据,只需要比你之前所做的好了一些就可以。加入刚开始你的推送到达率只有20%,增加手机厂商通道,60%,你把终极方案缓存方案(1,2,3,4)做好就行了。90%;另外统计消息到达率,需要多多理解一下:只要用户收到消息(代码层面)就叫做到达,还是用户必须看见消息叫做到达。
2020年2月13日
1.就业亮点简历:实训第三个月找工作之前必经之路
- 格式不能进行任何变化
- 简历和简历分析必须分页
为了避免你们多打印几份,浪费钱财。
2.加密方式及应用场景:MD5,AES/DES,RSA,CA证书
3.应用的插件化开发:如果直接搜索插件化,会给你很多种插件化方案,由于你的个人理解水平和技术水平可能不够,所以你可能根本看不懂,然后就放弃啦
- apk打包包含哪些东西:java文件(.class-->dex文件)res(字节码打包)其他的android解析必须的一些文件;
- 动态加载dex文件,也就是说动态加载java程序:DexClassLoader,PathClassLoader;
- 了解插件化如何开发:https://blog.csdn.net/hexingen/article/details/80555634
- 插件化框架:Small,阿里Atlas,腾讯Shadow,滴滴VirtualAPK,360开源RePlugin;
- 别忘了github
- 扩展:热更新:腾讯Tinker,阿里AndFix,美团Robust;Tinker官网有各个热更新框架对比:http://www.tinkerpatch.com/Docs/intro
|
Tinker |
QZone |
AndFix |
RoBust |
|
|
类替换 |
yes |
yes |
no |
no |
|
So替换 |
yes |
no |
no |
no |
|
资源替换 |
yes |
yes |
no |
no |
|
全平台支持 |
yes |
yes |
no |
yes |
|
即时生效 |
no |
no |
yes |
yes |
|
性能损耗 |
较小 |
较大 |
较小 |
较小 |
|
补丁包大小 |
较小 |
较大 |
一般 |
一般 |
|
开发透明 |
yes |
yes |
no |
no |
|
复杂度 |
较低 |
较低 |
复杂 |
复杂 |
|
Rom体积 |
Dalvik较大 |
较小 |
较小 |
较小 |
|
成功率 |
较高 |
较高 |
一般 |
最高 |
4.加固打包;
- 加固原理:使用壳程序包括我们开发的apk构建一个新的apk;使用C或C++,运用打包命令,增加一些加密参数,二次完成加密打包。把你的程序apk使用DexClassLoader进行一个加载。
参见:https://www.jianshu.com/p/4ff48b761ff6
- 加固所需素材:未签名未进行加固的apk文件
- 加固工具:网易易盾,360加固,腾讯的乐固
5.物联网,智能家居(没有屏幕和键盘按钮)的联网通信方案:
- 设备连接wifi:手机---->蓝牙---->智能设备(默认支持任何蓝牙设备的连接)
手机通过智能设备的app---->发送wifi信息(wifi名字和密码)----->通过蓝牙---->智能设备wifi模块
2. 远程操控设备:远程通过app发送任何数据------>服务商的服务器进行绑定的设备推送------>智能设备
扩展1:蓝牙通信:BluetoothManager-->BluetoothAdapter--->BluetoothDevice--->BluetoothSocket。
扩展2:即时通信SDK:极光IM,融云IM,环信IM
即时通信框架:Netty(NIO高速率IO流)
2020年2月14号
1.做过的项目,服务的人群:
- 简历上写的那几个项目,按照时间顺序,从刚毕业开始,然后说道最近在忙的项目。
- 再说每个项目的同时,把项目目标人群说上。比方:同学闹钟围绕同学间进行社交互动类的项目。
2.住在哪里,怎么来的:
- 本地,坐地铁或者公交,大概路程多长时间。
- 不在本地:就说我现在在哪个城市呢
3.异地找工作,为什么来这边工作?
- 从大城市回来:①大城市压力比较大,考虑到后续的发展,因为家里人和朋友都是在老家的,我在外面买房长期居住也很麻烦,所以才想着尽早回家,趁年轻多给后续铺垫一下。②在(某地)奋斗了3-4年了,自己的积蓄还不够一半的首付钱,我感觉太累了,大城市节奏快,感觉不太舒服,最近公司运营也有些问题,发展也不好,所以想出去看看。
- 从某个城市转战另外一个城市:①疫情原因,原公司运营情况不好,建议大家离职,之前就想来这边看看的,所以刚好借这个机会直接来这边发展看看。②公司原本这个项目就不准备做了,然后呢,北方雾霾天气的原因,自己每次雾霾天感觉喉咙都难受,所以就想来南方这边。③公司运营情况不好,刚好我朋友(家人)就在这个地方的某某地,一直说这边发展情况还不错,机会特别多,所以我就想来这边看看机会。
4.你期望的薪资是多少,之前公司的工资是多少?原工资比这次要的工资低1-2K就可以。面试之前必须确定以后的工资要多少,一次面试就是一次实际经历,这样的经历也就十几次,所以一次要比一次熟练。
5.为什么从上一家离职?
- 公司融资出现问题,工资拖欠了很久,其他人都走了,我这边实在是没办法
- 公司转型,这个项目不做了,以后公司在互联网这块业务也由线上转为线下运营,我们这些人都得走。
- 我们公司比较小,项目没做起来,然后老板上周突然告诉我们项目组解散不做了。
6.公司融资(推荐你们看一部电视剧:创业时代)
- 天使轮:好朋友,好哥们,好老大,由于跟你关系特别好,所以无还款期限投资你。
- A轮融资:首先项目已经有了一定的用户数或收入,然后你的项目远期规划也比较明朗,接着你有完善的项目规划白皮书和已经初具规模的团队,只是目前资金缺乏,如果后续某短时间没有资金注入,你的公司就没办法运营。目标:收入或者用户数能够达到投资机构的投资协议上规定的东西。如果目标在一定时间内没有达到,或者没有到规定的时间,就把融资的钱已经花完,则相当于你的项目规划白皮书存在一定的错误,投资机构就会重新审计你的项目。
- B轮融资:由于A轮已经达到了部分重点目标,所以B轮将打造此项目在某个领域成为行业独角兽,或者保持多少用户量并且盈利达到什么样的水平。分为B+和B-,最终是将A轮估值提升到几倍或者几十倍的水平,为上市进行整体的公司升级。
- C轮:实际跟B轮差不多,无非也是把公司项目做大做强,投资回报率提高。
7.接不接受外派?备注:外派就代表着甲方感觉你的技术水平不好的话,有权利直接解约,让你离场。
- 外派哪里,外派项目,外派周期(我的建议:至少一年时间或者短期的大公司外派)
- 外派过去有没有人接应,项目所需要的技术都是哪些(决定你过去能不能呆得住)
- 吃喝拉撒,衣食住行
8.哪个大学毕业的,学信网可查吗?问一下民教网可查可以吗?如果你已经了解到对方公司查学历,学信网可查;
- 不要特别在意自己的学历,不要对年月日,做哪些事情记得特别明白,这样会显得刻意
9.你对加班怎么看待的?
- 加班可以的,公司赶项目可以理解,工作这么多年,好像哪个公司都会加班,有时连续一个月都加班到凌晨,所以这个不是问题。
10.公司的人员配置和情况:
- 需要注意的是天眼查和企查查看看公司概况,然后百度一下应用,分析一下市场,然后确定你以后面试的时候该怎么说。
11.交过社保吗?你的社保交多少钱?
- 五险一金:包装的小公司的话,就说按照最低的(北京市企事业单位工资最低标准3500)交的,大概一个月700多吧,公积金好像是300多点。
12.你会使用kotlin、微信小程序、flutter、js开发吗?
- 如果你了解过这些东西:我之前了解过,这个东西呢是什么什么,使用什么工具进行开发,然后怎么样
- 如果你没有做过这些东西:我感觉编程语言都类似,如果公司有需要,我研究两三天,应该是可以快速上手做东西的,这个你放心,我在这一行业也做了这几年,有好多朋友做这个,我私下里问问他们。
13.你最擅长什么?
- 这几年一直在干开发,所以你问我最擅长什么,我感觉只能是代码开发了,因为这几天投入的精力全在这个上面。
2020年2月20日
1.简历投递网站
- BOSS直聘(隐藏痕迹):app和网页,没有数据记录,一般几个月后重新投递是没有记录可查的(学历,年龄,工作经历,公司),约面试几率在2%-10%;
- 智联招聘(隐藏痕迹):app和网页,不过公司不太好,一般联系比较少,适合海投,一页100家,一次投个300-500家。1%-4%
- 拉勾:所有信息真实可靠,因为有投递记录。
- 猎聘:主要是猎头中介给你推荐公司。
2020年2月21日
1.多个人合租两室或者三室,好处是:大家工作都不稳定,有可能找到的工作距离很远,但是工作地附近的房子房租又特别低,想换房子换不了;另外还有部分同学可能一直找不到工作,要离开这个城市,那么剩下的同学房租分摊就是个问题。
结论:大家先多人挤一挤,租个小一点的,等工作稳定再说。
2.抱团:①刚开始面试,好多问题回家需要大家在一块讨论,这个学习氛围如果没有的话,那可能后续面试也不会顺利,1W的工资就打水漂啦;②寻求安慰心理,刚开始混社会,容易产生孤独心理(面试受打击,环境也陌生,父母天天追问,学校天天询问情况)。
3.返校之后的面试计划:
刚开始面试的第一周建议大家在北京面试:
①从没真正经历过面试,需要看看面试流程和进入别人公司该怎么应对,怎么说话,矫正一下行为举止;
②北京面试比较严格,技术水平要求特别高,对你的说话真实性会认真的考量,所以这是打磨你面试能力的一个过程。
③在北京面试,可以每天晚上回学校查资料和跟大家交流,然后老丁给你们讲解面试问题,重新整理面试话术。
④因为要离开北京,所以要充分的使用①②③带来的好处,所以要把北京的面试机会尽量用完,提升自己。
第二周之后:根据个人面试情况和家庭因素,决定自己是否留在北京继续面试,或者大家抱团统一出发。
4.①节假日对我们没有任何影响,但是本年的清明节,没有找到工作的小伙伴,不建议回家,一回家就不想出去,耽误面试时间,遗忘面试问题。②找到工作的小伙伴,春天刚好,节假日出去玩玩,多练练代码。
2020年2月22日
1.简单介绍自己的项目 遇到什么难题 怎么解决的 主要是围绕你的项目
2.web和js怎么交互的 原理
3.apk瘦身
4.性能优化 内存优化 内存泄漏
5.banner的无限轮播是怎么做的
6.你觉得你在这个行业中有什么优势
1.项目里面遇到什么难题 怎么解决的;
- 维度影院:影院订票买票同步问题。
- 维度健康:
- fragment视频列表和activity底部栏手势控制显示隐藏问题;
- 视频流播放15秒处理问题;
- 阅读文章获取金币:根据移动手势进行判断,在onTouchEvent方法里面,记录Down手指按下的坐标,然后当手指移动MOVE事件中我们计算移动距离,当50像素<(移动距离/时间(单位秒))<1000像素,然后获取金币进度可以前进四分之一,但是移动最多不能超过总进度的四分之三。为了能让用户把全篇文章看完,所以我们要求,滑动到文章末尾算进度的四分之一。这样制定业务流程的好处在于:用户最起码翻动文章3次,然后还看到了文章结尾,不至于让用户反感。
- 购物类app:
- 购物车业务问题:
- 起初我们是这么做的:请求购物车列表,直接做展示,上线之后呢,有商户反映我的商品已经卖完了,就100件,结果你们怎么给我多出了几千件呢?
- 方案一:问题:购物车数量需要检验商品总数量,商品是否下架的问题。
- 购物车业务问题:
做法:添加和减少的时候需要同步一下,每次同步的时候,都会把所有商品id和数量传给后台。结果上线之后用户反馈:我看见商品优惠价格显示10元,但是我购物车里面怎么还是20元呢?
-
-
- 方案二:在方案一的基础上,在返回数据中把所有购物车数据都给返回,我们想到了坏处:耗流量,占网速;由用户反映:我网络不好的时候,增加和减少,数量不是一个一个添加的,一会添加上啦,一会又减少了?
- 方案三:问题:由于方案一和方案二都没有考虑并发请求造成的数据错乱问题,不知道以哪个返回结果为准?
-
做法:点击添加减少,删除等按钮增加加载圈避免用户操作,等到请求结束在让用户操作。
-
- 首页业务展示问题(内容多,布局不相同,内存溢出;最后找到了VLayout)
- 业务多,页面多,apk包特别大(插件化,动态加载apk);
- 推送到达率问题,推动点击率,提高用户转化;视频列表自动播放问题;
- 推播:瀑布流列表内存溢出问题;发布推播,相机拍照崩溃问题;从相册选择多张图片展示和内存处理问题;同学闹钟:alamManager对齐唤醒问题;闹钟响起Activity不弹出问题;闹钟响起手机不能唤醒问题。
- 所有app:bug监控和修复,怎样快速修复部分用户app出现的bug问题;如何监控so库出现的bug;
2.①java调用html中js代码:webView.getSetting().setJSEnable(true);webview.loadUrl("javascript:js方法");
②html中js调用java代码:webView.setJSInterface(java对象,js中的属性名字);@JavaScriptInterface注解java对象中被调用的方法;js中使用设置好的属性名字直接调用java对象的方法。
3.apk瘦身:lint工具扫描无用资源,尽量使用.9图,部分图片无需多套,直接剔除,UI设计png图片尽量压缩到最小;程序去除无用代码;so库去掉mip芯片架构;
4.android lint工具,DDMS中的Analyze Of Memory;Squra公司的LeakCanary集成到代码中检测内存泄漏
5.①第三方控件;②viewpager的adapter数量设置Integer最大值,然后当前位置设置一个特别大的数字;
③:把数据存放到两个数组中,当数据为第一个数组的末尾,则切换到第二个数组的第一位,数量不能小于3个。
6.由于本身比较年轻,能奋斗能思考问题,所有的问题和困难,都能大胆的尝试各种方法去解决,另外在这个行业认识了不少人都能给我提供帮助,还有各大公司的大牛也认识不少。在这些公司经历了很多产品,用到过特别多的方案,积累了很多经验,而且公司流程也熟悉了太多太多,所以各种情况都能适应。
2020年2月24日
1.activity的所有面试点:
- 你来说说activity的生命周期吧?
onCreate-onStart-onResume-运行中-onPause-onStop-onDestory onRestart
- 从activityA打开activityB会依次执行哪些生命周期?从activityB返回activityA会执行哪些生命周期?
- A打开B:AonPause--BonCreate--BonStart--BonResume--AonStop
- B返回A: BonPause--AonRestart--AonStart-AonResume--Bonstop--BonDestory
- activity的四种启动模式launchMode?多次打开会执行哪些方法?
- standard 标准的,每次打开都会创建
- singleTop 栈顶单例,如果在栈顶才能复用,不在栈顶,则创建; 应用场景:微信支付,支付回调页面;
- singleTask 栈内单例,如果栈内有的话,直接使用; 特性:复用的时候,会自动清空此activity上层所有的activity(栈的数据结构,类似于后来者居上的垒砖结构,如果要显示,必须把上层的砖一层一层剥离;先进后出) 应用场景:聊天框
- singInstance 一个栈内只允许一个Activity 应用场景:闹钟
- 三种single单例,如果被复用,肯定会执行onNewIntent(intent)方法,数据也就在intent参数里面
- activity异常关闭或者非栈顶时被回收,执行哪些方法?
- 哪些情况会关闭后台的activity?内存不足的时候,打电话,调用相机拍照;
- 执行的方法:onSaveInstanceState(Bundle)方法。
- 重新返回页面,执行onCreate(bundle),判断bundle是否为空,不为空则取出来onSaveInstance保存的数据
- activity横竖屏切换生命周期:
- android2.3版本以及之后:https://www.jianshu.com/p/8c40829905ec
- android2.2版本以及之前:https://blog.csdn.net/chen364567628/article/details/52725048
- 清单文件中android:configChanges配置
- Android视频播放器实现小窗口和全屏状态切换:https://blog.csdn.net/u010072711/article/details/51517170
- Android-->播放视频横竖屏切换的2种方式:https://blog.csdn.net/angcyo/article/details/78293465
- Activity进阶问题一:谈谈对主线程ActivityThread理解。
- Activity进阶问题二:谈谈对ActivityManagerService和WindowManagerService的理解。
- Activity进阶问题三:谈谈Activity启动过程。https://blog.csdn.net/caiyu_09/article/details/84837544?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
2.Handler的面试点:
- 简单描述Handler,Looper,MessageQueue,Message,也就是Handler机制
- 主线程中的Looper.loop()一直无限循环为什么不会造成ANR?https://www.jianshu.com/p/e149a2e89290
总结:通过查看activity源码,我们发现生命周期方法也是通过handler执行的,由于一个线程只能有一个Looper,所以不管新建多少个handler执行多少个message,都是同一个Looper,同一个MessageQueue做的处理。
- handler延时发送的理解:参见MessageQueue源码;无限循环--->耗电
- sendMessage()
- sendMessageDelay()
- sendMessageAtTime()
- 子线程中如何创建并使用handler:https://blog.csdn.net/u013092755/article/details/78888247
2020年2月25号
android ROOM数据库框架使用
2020年2月26号
1.了解MVVM
- MVP view---Presenter---model : 离不开回调,数据是一层一层向上传递,说白了只是逻辑上的清晰,代码上并没有很高级的设计。
- MVVM view-----ViewModel----model :
2.Jetpack 使用databinding数据绑定:https://www.jianshu.com/p/bd9016418af2
dataBinding { enabled = true }
- Fragment和Adapter怎么使用databinding:https://www.jianshu.com/p/e4633ec01095
- 抽离代码的时候,基类该怎么使用databinding
2020年2月27号
demo:https://github.com/VcStrong/JetpackDemo.git
1.Jetpack Lifecycle
- 使用:https://blog.csdn.net/u011810352/article/details/81203095
- 好处:基于观察者模式,AppCompatActivity或Fragment作为被观察者,如果被android系统回收之后,那么所有的LifecycleObserver观察者由于观察不到对象,则被系统自动回收,因此优化内存释放,提升了程序性能
- 坏处:对于初中级开发者不够友好,对于不了解Lifecycle好处的程序员不够友好;从代码角度,Lifecycle需要重新自己手写类代码和生命周期,降低了框架可读性,提高了理解难度。
2020年2月28日
demo:https://github.com/VcStrong/JetpackDemo.git
1.Jetpack ViewModel
- MVP架构理解(形象的理解,但不一定是最正确的理解)
|
View |
Presenter:接口回调 |
Model |
|
Activity |
Lifecycles+Livedata Lifecycles+ViewModel |
Model层数据bean类+请求工具类 |
- MVVM架构理解(形象的理解,可能是最正确的理解)
|
View |
ViewModel:观察者 |
Model |
|
Acitivity |
Lifecycles+Livedata+ViewModel |
Model层数据bean类+请求工具类 |
2.Jetpack Livedata
- 局限性:livedata官方建议按照生命周期的方式运行,所以一定需要LifecycleOwner配合,所以必须与Activity和Fragment相结合,所以一旦传入父类Context对象,则意味着Livedata只能在本页面中的frgement之间和本页面中的多个线程之间进行操作,一旦进入另外一个页面,livedata则无法观察和更新数据。
- 本页面数据共享使用Livedata+ViewModel;多页面数据共享使用EventBus和RxBus
2020年3月3日
1.flutter入门:移动端UI框架,理性使用,不吹不黑。
如果是公司应用,尽量不要使用,维护成本比较高,虽然说程序员只用一人便可多端开发,但不实际,结合多平台推送、即时通信、swift/java/Object-c、等等语言和业务方面,最好不要使用。
2.腾讯Tinker使用:官方文档:http://www.tinkerpatch.com/Docs/intro
关注官方demo开发:https://github.com/TinkerPatch
2020年3月5日
1.android framework理解
- Android架构四层:应用程序层(Application),应用框架层(framework),运行类库(Libraries),Linux内核层(底层Linux core)
- Framework包含:java-API源码(Activity源码,Handler源码),get****Manager()管理器的类(wifi,蓝牙,电话,Activity,Service,Window,电量等),C/C++上层接口(OpenGL绘图引擎,相机,蓝牙,音乐,wifi,电话,Activity,Window,电量等等)
- Framework能够开发什么:定制ROM开发(华为,小米,oppo,vivo等手机厂商),定制智能硬件系统(智能门锁,单元楼门禁,机器人屏幕,POS机,车载,电视),桌面工具(各种硬件的显示工具),系统工具,外接设备(眼镜,游戏手柄,按摩仪,U盘)等等;
- Framework开发所用语言:C/C++(重点),java(其次),shell(其次)
2.bsp开发:底层嵌入式开发(c/c++)
2020年3月6日
APP缓存
1.存储方式
- SharePreference,File,Sqlite,ContentProvider,网络:https://www.cnblogs.com/ITtangtang/p/3920916.html
- SharePreference使用:Context.getSharedPreferences("文件名",MODE_PRIVATE);
- File使用:
- 不建议使用字符流FileWriter和FileReader,因为默认使用系统编码,容易出现读写乱码。
- 建议使用字节流:InputStream和OutputStream等子类:https://blog.csdn.net/lisha006/article/details/82849776
- 高速存储:Channel通道的使用和理解:https://blog.csdn.net/qq_22771739/article/details/86370771
扩展:BIO(Block IO),NIO(New(sycn) IO),AIO(Async IO)是什么
- Sqlite使用:继承SqliteOpenHelper
- 数据库框架:老版:LitePal,ORMLite,GreenDao,Realm
新版:Room(50K大小,针对上万条数据的操作而言效率低),ObjectBox(1-1.5M的依赖大小,针对上万条数据操作速度特别快):https://juejin.im/entry/59ca6db55188257a125d85b9
- ContentProvider:一般都用于访问系统自带工具的数据,通话记录,短信,联系人等等
- 网络:http cache服务端或者客户端自建缓存文件
2.不同的业务场景该采用哪种方式进行存储
- 登录记住用户名和密码:采用SP的方式
- app业务使用用户信息:数据库保存,不同页面进行读取;为啥用数据库?大型项目在公司中都会要求android手机端数据库进行加密,技术上使用Sqlcipher完成,用来存放数据比较安全,而其他存储方式容易被**或者不方便使用。
- 首页列表等数据:所有的方案都有两面性,利大于弊。
- 方案一:有网每次请求50条完成后,进行数据库保存和页面展示,无网进行读取数据库最近一次保存的50条进行展示;
-
- 问题一:结果可能会出现无网展示然后加载更多出现数据时间不一致,上下错乱问题。
- 问题二:服务器已经删除的数据,客户端依旧在展示。
- 问题三:数据内容(点赞数,评论数)已经发生改变,客户端没有任何的变化。
-
- 方案二:在方案一基础上,问题一(优先级低,对于用户浏览影响度小)不解决,解决问题二和问题三,①判断页面展示的50条是不是无网时候读取的数据库数据,②如果为无网展示,那么加载更多的时候,会增加一个请求,这个请求会把所有无网数据的id发送给后端,后端返回最新的数据,然后更新列表;列表刷新不用管。
- 方案三:
- 方案一:有网每次请求50条完成后,进行数据库保存和页面展示,无网进行读取数据库最近一次保存的50条进行展示;
- 输入的关键字历史记录:数据库保存,按时间顺序查找
- 电子书:RandomAccessFile读写文件,如果是下载,后端判断用户是否符合下载全本的资格和前端提供的数据(试读,预存,部分章节,下载全本等),请求不一定使用同一个连接,但都会操作同一个文件,然后返回相关流数据,进行本地存储;每次下载完成需要进行智能的章节归类(目录整理,智能断章,记录章节名称字节数所在位置:https://blog.csdn.net/ProgramChangesWorld/article/details/47209475)读取使用seek跳过多少字节,每次读取10KB的数据进行展示;
- 即时通讯IM的好友列表等:数据库;进入应用直接拉取列表,保存到本地,最好重新新建一个数据表作为好友数据的保存;在每次打开好友列表和打开应用的时候自动刷新保存到数据库中。