一、Activity
1、Activity生命周期
- 正常情况
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()
onCreate:Activity创建,初始化资源或者异常处理。
onStart:Activity已经可见,但是还没显示到前台,无法与用户交互。
onResume:Activity显示到前台,可以与用户交互。
onPause:Activity无法与用户交互,但是此时还能看见,例如打开了一个透明主题的Activity。
onStop:不可见,位于后台,无法与用户交互。
onDestory:Activity销毁。 - 生命周期的几种情况
(1):onRestart何时调用:Activty由不可见变为可见时。
按下Home键重新打开Activity:onRestart->onStart->onResume
A启动B后,退回A,同上。
(2):onPause与onStop肯定会一起调用吗?不一定,当打开的的Activty是透明的时,只会调用onPause。
A打开B时,二者的生命周期顺序为:
onPause->onCreate->onStart->onResume->onStop
也就是说A的onPause会在B显示出来前调用,因此不能在onPause执行太多耗时操作,会影响新的Activity的显示,同样onStop也不能,会导致新Activity卡顿。 - 异常情况的生命周期
(1)异常情况由横竖屏切换和内存不足回收Activity。
可用onSaveInstanceState保存数据,onRestoreInstanceState恢复数据,一般不使用onCreate,因为onRestoreInstanceState一旦调用,里面肯定有数据,而onCreate需要判断是否为空。
(2)onSaveInstanceState与onRestoreInstanceState不会成对调用。
onSaveInstanceState调用时机:按下Home,按下Memu选择别的程序,启动别的Activity,按下电源键,横竖屏切换等,注意按Back键或者finish等用户主动关闭不会调用。
onRestoreInstanceState调用时机:异常情况被系统关闭才会调用,例如横竖屏切换,生命周期为:
onPause->onSaveInstanceState->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState->onResume
2、启动模式及其应用场景
启动模式4种:standard,singleTop,singelTask,singleInstance。
- onNewIntent的调用时机
(1)singleTop模式的Activity, 仅当该Activity已经在Task的顶部了, 才会复用.
复用生命周期:onPause->onNewIntent->onResume
(2) singleTask模式的Activity, 同一个Task中只会存在一个实例. 如果Task中还没有, 则新建, 放在Task顶部; 如果Task中已经有该Activity实例, 回退上面所有的Activity,然后复用该Activity.
singleTask模式的Activity的复用模式:
如果已经在Task顶部, 如同singleTop的复用模式;
如果不在Task顶部, 则销毁Task中该Activity顶部的所有其他Activity, 通过onNewIntent唤起该Activity, 走onRestart流程,即:
onNewIntent->onRestart->onStart-onResume. - 应用场景
通知栏的通知/消息使用singleTop,因为消息推送可能有多条,点击进去是一个详情页,详情页一般是同一个Activity,不能点击多次就打开多个Activty。
MainActivity一般使用使用singleTask,MainActivty一般是在栈底,用户希望返回MainActivity后再点击Back就能退出应用。
https://www.jianshu.com/p/c97688eb5056
二、Fragment
1、Fragment生命周期
与Activity不同的地方是:
(1)onAttach():回调将在Fragment与其Activity关联之后调用,可以得到Activity的引。
(2)onCreate():创建实例
(3)onCreateView():创建Fragment视图
(4)onActivityCreate():Activity中onCreate回调
与Activity的通信、与Fragment的通信
SharePreference相关
1、SharePreference为什么进程间通信不是安全的?
SharePreference中新建时可以指定加载模式是MODE_MULTI_PROCESS,用来支持多进程使用,但是无法做到多进程同步更新。SharePreference首次加载时会把所有内容从磁盘加载进内存,以后读取直接从内存中读取,修改后提交事务则会把内容先写进内存,然后写进磁盘。MODE_MULTI_PROCESS的作用只是说当调用getSharedPreferences()时即使内存中存在缓存也会从磁盘中获取,之后还是从缓存中获取数据。即使每次获取内容都调用getSharedPreferences()直接从磁盘读取数据,也不是同步的,因为Android原生的文件访问并不支持多进程互斥,也就是可能一个进程正在写数据,一个进程读数据,那么得到的数据可能是脏数据,这个问题也无法同个加锁来解决,因为进程间无法共享内存,实际上是两把锁。
2、commit和apply的区别
commit和apply都是提交事务,先把内容更新到内存中,在写入到磁盘中。不同的是commit是在当前线程中执行,而apply在当前线程写入内存缓存,然后在线程中把内容写进磁盘中。所以不要在主线程中执行commit操作。
https://zhuanlan.zhihu.com/p/22913991
https://www.jianshu.com/p/4984f66f9a4b
线程执行相关
1、多个线程如何顺序执行
https://blog.csdn.net/quliangmao/article/details/78666417
2、线程打印AB,多个线程执行如何确保打印出AA...BB
https://www.jianshu.com/writer#/notebooks/25326932/notes/28629104/preview
3、多线程交替打印ABC
https://blog.csdn.net/xiaokang123456kao/article/details/77331878