Activity
Activity
1、生命周期
onCreate() -> onStart() -> onReume()->onPouse()->onStop()-> onDestroy()
打开新的activity:onCreate() -> onStart() -> onReume()
Activity A -> Activity B : onPouse()->onStop()->onCreate() -> onStart() -> onReume()
返回到Activity A: OnRestart()->onStart->onResume()
按back按键回退Activity时,onPause()->onStop()->onDestroy()
2、切换横竖屏时,生命周期的变化
2.1 正常情况
onPause()->onSaveInstanceState()->onStop()->onDestroy()->onCreate() -> onStart()->onStartInstanceState()->onResume()
2.2 配置android:configChanges
配置完成避免重走生命周期
android:configChanges = "orientation | screenSize"
不会重新走一遍生命周期,而是调用onConfigurationChanged方法
3、Activity启动模式
四大启动模式
Strandard:标准模式
SingleTop:栈顶复用模式
SingleTask:栈内复用模式
Single Instance:单例模式
3.1 Strandard模式
默认的启动模式,新启动的Activity就直接加入到栈中,先进先出的原则,同一个Activity会重复创建
3.2 SingleTop模式
SingleTop模式每次会从栈顶拿activity,两种情况
1、如果栈顶不是当前的Activity,就会创建Activity添加到栈顶
2、如果当前的栈顶就是当前的Activity,直接通过onNewInstant()方法拿到当前的Activity
3.3 SingleTask模式
SingTask模式属于栈内模式
1、如果当前栈中不存在当前的Activity,就直接创建
2、如果当前的栈中存在当前的Activity,就弹出该Activity上面的所有的Activity,将它置为栈顶
3.4 SingleInstance 模式
SingleInstance模式每次进行启动Activity时,都会创建一个栈进行保存,当使用到该Activity时,就会从指定的栈中取出当前的Activity
3、如何设置启动模式
3.1 通过清单文件AndroidManifest.xml配置Activity的启动模式
android:launchMode="standard"
3.2 直接再代码中实现
Intent intent = new Intent(this, lyActivity.class);
intent.addFlags(Intent.FLAC_ACTIVITY_NEW_TASK);
starthctivity(intent)
注:第二种的优先级会高于第一种,两者都存在使用第二种
4、Activity的启动流程
4.1 跨进程启动
- 点击App图标,Launcher进程会采用Binder IPC向系统system_server进程发起startActivity的请求;
- system_server进程收到请求后,向zygote进程发送创建进程的请求;
- zygote进程fork出新的子进程,即App进程
- App进程,通过Binder IPC向system_server进程发起attachApplication请求;
- system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向APP进程发送scheduleLaunchActivity请求
- App进程的binder线程在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息,主线程收到message后,通过反射机制创建目标Activity,并回调Activity.onCreate()方法。
4.2 进程内启动
- 请求进程A:startActivity-》system_server进程:AMS(ActivityManagerService)
- 解析Activity信息、处理请求参数、消息处理
- 回到请求进程A:Application Thread->ActivityThread->Activity生命周期
5 ANR的四种场景
- Input Dispatching timeout:5s 内未响应键盘输入、触摸事件等
- Service TimeOut :service 未在规定时间执行完成:前台服务20s,后台服务200s
- BroadCaseQueue TimeOut:未在规定时间内处理完广播,前台广播10s内,后台广播60s内
- Content Provider TimeOut:public在10s内没有完成
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 胡萝卜!