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流:Android面试培训-初中高面试

 

  • 异常处理: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日

  • 线程间的通信:
  1. Handler+子线程
  2. AsyncTask 异步任务
  3. EventBus 事件总集

使用RxJava实现线程间通信

 

Thread+ Runnable 子线程没有返回值

Future+ Callable 子线程有返回值

  1. 广播
  2. ContenProvider(间接)
  3. File(间接)
  4. Intent 隐式跳转 (Acitivty,Service)
  5. 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,意思是数据流末尾标识,则需要主动告诉服务器我已经读取结束。

Android面试培训-初中高面试

 

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.支付流程

Android面试培训-初中高面试

 

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

 

Android面试培训-初中高面试

 

Android面试培训-初中高面试

 

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)

  1. 当未超过核心线程数时,就直接创建一个核心线程去执行任务。
  2. 当超过核心线程数,就将任务加入到workQueue的任务队列中等待
  3. 当任务队列中任务添满时候,在不超过最大线程数的情况下启动线程去处理任务
  4. 当线程数量超过最大线程数时,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. 客户端需要保存推送的信息。
  3. 服务器把剩余没有收到的用户进行二次消息推送,重复1,2过程。
  4. 每次打开应用的时候,使用http请求的方式获取一次新消息,重复2过程。
  5. 消息去重,由于我们接到消息使用方式无非就是两种:直接展示在页面上或者弹出通知
  6. 领导要求消息到达率是多少,你需要有一个预估,不要去逼问领导需要什么样的数据,只需要比你之前所做的好了一些就可以。加入刚开始你的推送到达率只有20%,增加手机厂商通道,60%,你把终极方案缓存方案(1,2,3,4)做好就行了。90%;另外统计消息到达率,需要多多理解一下:只要用户收到消息(代码层面)就叫做到达,还是用户必须看见消息叫做到达。

 

2020年2月13日

1.就业亮点简历:实训第三个月找工作之前必经之路

  • 格式不能进行任何变化
  • 简历和简历分析必须分页

为了避免你们多打印几份,浪费钱财。

2.加密方式及应用场景:MD5,AES/DES,RSA,CA证书

3.应用的插件化开发:如果直接搜索插件化,会给你很多种插件化方案,由于你的个人理解水平和技术水平可能不够,所以你可能根本看不懂,然后就放弃啦

  1. apk打包包含哪些东西:java文件(.class-->dex文件)res(字节码打包)其他的android解析必须的一些文件;
  2. 动态加载dex文件,也就是说动态加载java程序:DexClassLoader,PathClassLoader;
  3. 了解插件化如何开发:https://blog.csdn.net/hexingen/article/details/80555634
  4. 插件化框架:Small,阿里Atlas,腾讯Shadow,滴滴VirtualAPK,360开源RePlugin;
  5. 别忘了github
  6. 扩展:热更新:腾讯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.物联网,智能家居(没有屏幕和键盘按钮)的联网通信方案:

  1. 设备连接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横竖屏切换生命周期:
  • 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做的处理。

 

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 }

 

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.存储方式

扩展: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发送给后端,后端返回最新的数据,然后更新列表;列表刷新不用管。
    • 方案三:
  • 输入的关键字历史记录:数据库保存,按时间顺序查找
  • 电子书:RandomAccessFile读写文件,如果是下载,后端判断用户是否符合下载全本的资格和前端提供的数据(试读,预存,部分章节,下载全本等),请求不一定使用同一个连接,但都会操作同一个文件,然后返回相关流数据,进行本地存储;每次下载完成需要进行智能的章节归类(目录整理,智能断章,记录章节名称字节数所在位置:https://blog.csdn.net/ProgramChangesWorld/article/details/47209475)读取使用seek跳过多少字节,每次读取10KB的数据进行展示;
  • 即时通讯IM的好友列表等:数据库;进入应用直接拉取列表,保存到本地,最好重新新建一个数据表作为好友数据的保存;在每次打开好友列表和打开应用的时候自动刷新保存到数据库中。

相关文章:

  • 2022-12-23
  • 2022-02-07
  • 2021-07-29
  • 2022-12-23
  • 2021-11-23
  • 2021-04-23
猜你喜欢
  • 2021-11-09
  • 2021-11-11
  • 2021-07-31
  • 2021-08-16
  • 2021-11-22
  • 2021-07-10
  • 2021-11-17
相关资源
相似解决方案