1,Activity的生命周期
正常情况下生命周期:oncreate--onStart--onResume--onPause--onStop--onDestory
异常情况下:onSaveInstanceState-onPause-onStop-onDestory 重建后onCreate--onRestoreInstanceState
系统资源不足会回收低优先级的activity,前台--可见但非前台--后台 后台被优先回收,会调用onSaveInstanceState和onRestoreInstanceState来保存和恢复数据。
2,onStart onResume和onPause onStop的区别?
onStart onStop是针对activity是否可见来说的,onPause onResume是从activity是否位于前台来回调的
3,Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明的呢?如果启动的是一个Dialog呢?
onPause--onSto--onDestory,onPause, 当前dialog启动不会执行任何回调,其他activity会回调onPause
4,如何避免配置改变时Activity重建?
在miannifest文件注册activity清单配置configChanges属性,常用的属性有local orientation和keyboardHidden,分别代表系统语言、屏幕旋转和屏幕键盘
5,Activity的四种启动模式?
standard默认启动模式 singleTop栈顶模式 singleTask栈内复用模式 singleInstance单实例模式
standard标准启动模式,每次启动都会新建一个实例对象,会默认进入启动它所在的任务栈
singleTop栈顶复用模式,如果新activity在栈顶,那么这个activity不会被重新创建,并且会回调onNewIntent方法,通过这个方法的参数取出当前请求的信息。
singleTask栈内复用模式,如果新的activity在栈内存在,那么不会重新创建实例,也会回调onNewIntent方法,会把启动的activity放到栈顶,之前在栈内在这个activity之上的会出栈销毁。
singleInstance单实例模式,加强的singleTask,这个模式的activity只能单独存在一个任务栈中,后续请求均不会创建新的实例。
6,什么是activity需要的任务栈?启动Activity的标志位?
activity的一个参数taskAffinity 任务相关性,默认是应用的包名,它主要是和singleTask配对使用的,新建的activity实例会运行在名字和taskAffinity的任务栈中。
NEW_TASK,SINGLE_TOP, CLEAR_TOP,(singleTask中设置这个flag,如果被启动的采用standard模式,那么它和它之上的activity都会出栈。)FROM_RECENTES,(不希望通过back按键返回到这个activity,不会出现在历史activity列表中)
7,onNewIntent调用时机
前提:activity已经在栈中存在,启动模式为singleTop,activity在栈顶时,会回调onNewIntent。 启动模式为singleTask和singleIns时会回调onNewIntent。
8,activity的启动流程
主要是根activity的启动,luncher组件会向ams发送一个启动activity的进程间的通信请求。activityManagerService是一个系统关键服务,主要负责系统activity的启动和调度。luncher组件也是由ams所启动,是手机的home程序,管理和显示手机的所有应用。从packagemanagerservic中获取应用信息。
1,luncher组件首先向ams发送一条启动应用根activity的进程间通信请求
2,ams会把这要启动的应用信息保存下来,然后让luncher组件进入终止状态通信请求。
3,luncher进入终止状态后会给ams一个已经终止完毕的信号,ams收到信号后会继续进行启动activity的请求
4,ams去寻找这个运行activity的进程,如果这个进程不存在,它就会给zaygote进程发送一个进程间的请求,zaygote进程会通过最终调用fork方法通过复制自身创建一个新进程。zaygote进程在创建的时候会在内部创建一个虚拟机实例,通过复制它自身就能得到一个应用程序。
5,最后ams将第二步保存下来的Activity组件信息发送给zaygote进程创建的新的进程,
6,新的应用进程启动完毕后,就会给ams发送一个启动完成的进程间的请求,经过一系列调用startactivity方法来启动activity