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文件中进行注册,使用<
这种形式的广播接收器生命周期伴随着整个应用。
优先级由<
动态注册:
在代码中定义并设置好一个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
工作原理
在主线程中创建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。
21.Android中大图加载
22.Android中Binder机制
https://www.jianshu.com/p/225ccd39a667
23.Android多渠道打包
24.Android&Java集合框架
https://www.jianshu.com/p/44422a1da4f2