2020Android工程师个人面试总结

1.Activity的生命周期、启动模式以及启动过程

https://blog.csdn.net/xiajun2356033/article/details/78741121

生命周期

四个状态:running paused stopped killed
running:当前显示在屏幕上的Activity,用户可见,可交互
paused:依旧用户可见,但是已经失去焦点,不可交互
stopped:用户不可见,也不可交互
killed:等待被系统回收

onCreate() >>onStart()>>onResume()>>onRestart()>>onPause()>>onStop()>>onDestory()

Activity A切换到B执行方法:
A:onCreate()>>onStart()>>onResume()>>onPause()
B:onCreate()>>onStart()>>onResume()
A:onStop()>>onDestory()

A切换到B(B是以DialogActivity形式存在的)执行方法:
A:onCreate()>>onStart()>>onResume()>>onPause()
B:onCreate()>>onStart()>>onResume()

当用户按下home后,再返回,执行的方法:
onPause()>>onStop()>>home>>onRestart()>>onResume()

Activity中的onSaveInstanceState和onRestoreInstanceState()
onSaveInstanceState(Bundle outState):
保存有ID组件的状态,在系统销毁Activity时。调用时机是在onStop之前,但是不确定在onPause之前还是之后。用户主动销毁Activity不会调用。
onRestoreInstanceState(Bundle outState):
再系统销毁Activity后,重新创建时可以调用。该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate() 方法中;

有关横竖屏切换生命周期的变化:https://www.jianshu.com/p/52aa3a2c0417

横竖屏切换会根据configChanges配置来决定是否销毁Activity.

不配置configChanges属性
设置android:configChanges="orientation"
设置android:configChanges="orientation|keyboardHidden"(3.2系统之前的系统不会执行生命周期方法了)
以上三种配置,横竖屏切换时Activity均会销毁重建,Activity的生命周期都会重新执行一次

配置 android:configChanges="orientation|keyboardHidden|screenSize"
不会销毁重建

启动模式(以及使用场景)

standerd 标准模式 不管有没有实例都会重新创建一个实例
场景:多数普通的Activity界面

singleTop 栈顶模式 如果实例位于任务栈顶,则不重新创建。若不位于栈顶则重新创建实例
场景:消息接收界面例如QQ弹出的消息界面

singleTask 栈内唯一模式 若当前任务栈中存在实例,那么将此实例之上的其它实例全部退出,使得此实例位于栈顶
场景:首页主界面

singleInstance 新栈唯一模式 每次都会新建一个任务栈,并且在这个栈中只存在一个实例
场景:与主界面分离的页面如闹钟提醒

启动过程

2.Service相关

https://www.jianshu.com/p/95ec2a23f300

两种启动方式

start启动
onCreate()>>onStartCommand()>>onDestroy()
调用stopService(intent)停止service。一旦服务开启,其生命周期与调用者无关,调用者不能调用service中的方法。
bind启动
onCreate()>>onBind()>>onUnbind()>>onDestroy()
调用unbindService(serviceConnection)停止service。生命周期与调用者绑定

如何调用服务里面的方法:https://www.jianshu.com/p/2fb6eb14fdec
bind方式启动时:
在服务类内部创建一个内部类,可以间接调用服务中的方法
实现onbind方法,返回的就是这个内部类
在activity中绑定service bindService(intent,serviceConnection,_)
在绑定成功的回调onServiceConnectioned中会传递一个IBinder对象
强制类型转换为自定义的接口类型,调用接口里面的方法
start方式启动时:
通过Bundle携带参数。在service类中的onStartCommand方法中接收,通过接收bundle携带的参数判断调用方法。

intentService
https://blog.csdn.net/b1480521874/article/details/94987641
intentService可以看作是service和handerTheard的结合,在完成任务后会自动停止

intentService是继承自service处理异步请求的一个类,在内部有一个工作线程来处理耗时操作。
完成任务后会自动停止不需要手动停止。
如果启动多次,每一个耗时操作会以工作队列的方式在intentService的onHandlerIntent回调中执行。

3.Boradcast receiver

https://www.jianshu.com/p/f348f6d7fe59

BoradcastReceiver是对发送出来的boradcast进行过滤、接收和响应的组件。在执行完onReceiver()方法后,生命周期结束。

类型标准广播 有序广播
标准广播:
· 完全异步执行
· 所有广播几乎在同一时间接收到,没有先后顺序
· 效率高,无法被截断
有序广播
· 同步执行
· 同一时间只有一个广播接收器接收到这个消息,有先后顺序
· 如果消息被截断,那么后面的广播接收器就无法接收到这条消息

注册静态注册 动态注册
静态注册:
在manifest.xml文件中进行注册,使用<>声明,并在标签内用<>配置过滤器。
这种形式的广播接收器生命周期伴随着整个应用。
优先级由<>中priority决定,数值越到优先级越高。
动态注册:
在代码中定义并设置好一个IntentFilter对象。调用registerReceiver()进行注册。

本地广播
之前发送的广播属于系统广播,手机内的其它应用都可以接收到,而且该应用也可以接收到其它应用发送的广播。
本地广播,只有应用内部才能接收到。 使用LocalBoradcastManager进行管理

4.Http与Https的区别

https://www.cnblogs.com/ganchuanpu/p/9361424.html
http:超文本传输协议
https:基于安全套接字的超文本传输协议。https = http + ssl

5.基本排序算法

https://www.jianshu.com/p/c3670e7aa1b0

选择排序 冒泡排序 快速排序 合并排序 堆排序

6.进程保活

https://www.jianshu.com/p/63aafe3c12af
保活手段:当前业界保活手段主要分类 黑 灰 白 三种
黑色保活:不同app进程,利用广播相互唤醒
白色保活:启动前台service
灰色保活:利用系统漏洞

黑色保活
不同app的进程用广播相互唤醒
1⃣️利用系统中拍照、开机、网络切换、拍视频时产生的系统广播进行 唤醒
2⃣️通过接入第三方应用的SDK唤醒,例如微信SDK、支付宝SDk
3⃣️假如你手机里装了支付宝、淘宝、天猫、UC等阿里系的app,那么你打开任意一个阿里系的app后,有可能就顺便把其他阿里系的app给唤醒了。(只是拿阿里打个比方,其实BAT系都差不多)

白色保活
调用系统api启用一个前台service
例如QQ音乐,会在手机通知栏出现一个Notification。

灰色保活
利用系统漏洞启动一个前台service,但是不会在系统通知栏出现notification,用户不易察觉

7.事件分发机制

https://blog.csdn.net/salmon_zhang/article/details/76746159
https://blog.csdn.net/guolin_blog/article/details/9097463

由外到内传递,由内到外处理
事件传递:Activity>>ViewGroup>>View

三个重要的方法:
dispatchTouchEvent :分发事件
onInterceptTouchEvent:拦截事件
onTouchEvent:处理事件
1.当onInterceptTouchEvent返回ture时,若onTouchEvent返回true,后续事件将不再经过该ViewGroup的onInterceptTouchEvent方法,直接交由该ViewGroup的onTouchEvent方法处理;若onTouchEvent方法返回false,后续事件都将交由父ViewGroup处理,不再经过该ViewGroup的onInterceptTouchEvent方法和onTouchEvent方法。
2.当onInterceptTouchEvent返回false时,事件继续向子View分发;
3.对于子View,当onTouchEvent返回true,父ViewGroup派发过来的touch事件已被该View消费,后续事件不会再向上传递给父ViewGroup,后续的touch事件都将继续传递给子View。
4.对于子View,onTouchEvent返回false,表明该View并不消费父ViewGroup传递来的down事件,而是向上传递给父ViewGroup来处理;后续的move、up等事件将不再传递给该View,直接由父ViewGroup处理掉。
5.onTouch先于onTouchEvent调用,onClick事件是在onTouchEvent中ACTION_UP中触发的。

8.handler消息传递机制

https://www.jianshu.com/p/b4d745c7ff7a
作用:将工作线程的消息传递到UI主线程中,从而实现工作线程对主线程的更新,避免线程操作不安全的问题
使用:https://www.jianshu.com/p/e172a2d58905

工作原理

27C8A243-B380-4249-A873-FBEAC76DCA09.png

在主线程中创建Looper和MessageQueue,通过handler.sendMessage或者handler.post发送消息进入MessageQueue。Looper不断的循环从消息队列中取出消息,发送给消息创建者handler。handler接收消息,在handleMessage方法中处理。

9.自定义view

分类
绘制

10.MVC、MVP、MVVM各种框架的区别

https://www.jianshu.com/p/78e0a508b1c6

11.常用设计模式

单例模式、builder模式、策略模式、观察者模式

12.五种存储方式

sharePreference contentProvider File SQLite 网络存储

13.六大布局

14.AsyncTask

https://blog.csdn.net/lingguiqin/article/details/79184356
一个轻量级的异步任务类,内部封装了线程池和handler。

15.优化方面

16.TCP/IP协议相关

https://blog.csdn.net/blessed24/article/details/74278113
TCP与UDP https://www.jianshu.com/p/247b0b20bba7

17.Android中的多线程

https://www.jianshu.com/p/2ed25d4f894d
https://www.jianshu.com/p/d8e0100ead4e

18.Android性能优化

https://blog.csdn.net/xiangzhihong8/article/details/92800490

19.Android webView如何与Js交互?遇到什么问题?

https://blog.csdn.net/jerrywu145/article/details/57512366
交互:1.首先对webView进行设置,是否支持Js调用、是否支持缩放等等
2.设置监听setWebChromClient监听加载网页过程
3.在监听方法中的onProgressChanged中,判断网页加载完成后调用web.loadurl('''javascript:call()')对Js方法进行调用
遇到的问题:调用不成功?
解决:检查是否设置了支持Js调用、检查知否加入了 @JavascriptInterface 注解、检查是否在网页完全加载成功后调用的JS方法

20.Android中滑动冲突问题的解决

1.布局中嵌套recycleView
2.recycleView多级嵌套
https://www.jianshu.com/p/c5ccf0c38186

3.viewPager嵌套
https://www.jianshu.com/p/4cbd0f8341fb

使用coordinatorLayout包裹

21.Android中的context的理解

https://www.cnblogs.com/Jason-Jan/p/8465664.html
context是一个抽象类,它提供了应用的环境信息。我们可通过它启动Activity、发送广播、接收Intent信息等。Activity、server就是一个context。

687474703a2f2f75706c6f61642d696d616765732e6a69616e7368752e696f2f75706c6f61645f696d616765732f313138373233372d316234633063643331666430313933662e706e673f696d6167654d6f6772322f6175746f2d6f7269656e742f7374726970253743696.png

21.Android中大图加载

22.Android中Binder机制

https://www.jianshu.com/p/225ccd39a667

23.Android多渠道打包

24.Android&Java集合框架

https://www.jianshu.com/p/44422a1da4f2

你可能感兴趣的:(2020Android工程师个人面试总结)