一、setResult() 和 finish() 的顺序关系?
A ——> startActivityForResult ——> B ——>setResult ——> finish ——> A——>onActivityResult ——>onRestart——>onStart——>onResume
二、onSaveInstanceState() 和 onRestoreInstanceState()
1、如果是用户自动按下返回键,或程序调用finish()退出程序,是不会触发onSaveInstanceState()和onRestoreInstanceState()的。
2、每次用户旋转屏幕时,您的Activity将被破坏并重新创建。当屏幕改变方向时,系统会破坏并重新创建前台Activity,因为屏幕配置已更改,您的Activity可能需要加载替代资源(例如布局)。即会执行onSaveInstanceState()和onRestoreInstanceState()的。
3、通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
4、onSaveInstanceState(Bundle outState)会在以下情况被调用:
1、当用户按下HOME键时。
2、从最近应用中选择运行其他的程序时。
3、按下电源按键(关闭屏幕显示)时。
4、从当前activity启动一个新的activity时。
5、屏幕方向切换时(无论竖屏切横屏还是横屏切竖屏都会调用)。
在前4种情况下,当前activity的生命周期为: onPause -> onSaveInstanceState -> onStop。
5、onRestoreInstanceState(Bundle savedInstanceState)只有在activity确实是被系统回收,重新创建activity的情况下才会被调用。
6、onCreate()里也有Bundle参数,可以用来恢复数据,它和onRestoreInstanceState有什么区别 ?
onSaveInstanceState 不一定会被调用,所以onCreate()里的Bundle参数可能为空,如果使用onCreate()来恢复数据,一定要做非空判断,而onRestoreInstanceState的Bundle参数一定不会是空值,因为它只有在上次activity被回收了才会调用。而且onRestoreInstanceState是在onStart()之后被调用的。有时候我们需要onCreate()中做的一些初始化完成之后再恢复数据,用onRestoreInstanceState会比较方便。
三、onNewIntent() 和 onConfigurationChanged()
Activity的启动模式的4种:
1.standard标准启动模式,默认的启动模式。每一次启动这个activity都会创建新的activity实例。被启动的activity会被放入启动者的栈中,如果启动者除Activity之外的Context(如Application),这时没有任务栈,就会报错,此时需要指定FLAG_ACTIVITY_NEW_TASK标记位,创建一个新的栈。
应用场景:绝大部分普通的场景下使用的acticity。
2.singleTop栈顶复用模式,设置这个模式的activity,如果任务栈的栈顶存在这个activity,则不会重新创建新的activity,这个activity 的onNewIntent()方法会被调用。
应用场景:通过通知栏来启动的页面。
3.singTask栈内唯一,在当前任务栈里面只能有一个activity实例的存在。当启动这种模式的activity时,会检查任务栈中是否存在这个activity,如果存在,则会调用该activity的onNewIntent()方法,并且把它上面的activity全部清空 ,这个activity称为栈顶。
应用场景:App中的一般使用的MainActivity或者其他一些需要占用大量系统资源的Activity。浏览器的主界面,不管多少个应用启动浏览器,只会启动一次浏览器主界面,其余的情况走OnNewIntent方法,并且会清空主界面上的其他actvity。
4.singleInstance,这个模式里面的activity会运行在自己的任务栈里面,并且这个任务栈里面只有一个实例存在。启动这个模式的Activity,如果当前系统中有这个样的一个Activity已经被启动,会把它所在的任务栈切换到前台,这个activity的onNewIntent()会被调用。如果你要保证在整个手机操作系统里面只有这一个activity,则可以使用这个模式。
应用场景:打电话界面
这几种场景下Activity不会重新被创建,onNewIntent方法会被调用。
1.singtop模式启动的activity,在任务栈中存在。
2.singTask模式启动的activity,任务栈中存在。
3.singInstance模式启动的acitivity,系统中已经存在一个栈包含这个activity。
这些情况下可以通过setIntent(intent)来刷新intent数据.
当系统配置(如系统语言,屏幕方向)发生改变后,系统会销毁当前的activity重新创建一个新的activity,重新执行一次生命周期方法。
如果屏幕旋转时,不希望Activity被销毁,可以在配置信息中声明:
android:configChanges = “orientation|screenSize”在这种情况下,如果屏幕旋转方向,Activity则不会被销毁,他的onConfigurationChanged()方法会被调用,通过读取configuration来读取对象中最新的配置来适配UI界面。
四、Service的生命周期方法是onCreate、onStartCommand、onDestroy、onBind、onUnBind,执行在什么线程?
Service的onCreate方法是在ActivityThread的handleCreateService方法调用的,handleCreateService方法是私有方法,它在H类的handleMessage方法中被调用,handleMessage方法的运行线程由创建H类时的Looper对象决定,H类创建时并没有传入相关的Looper对象,所以默认的使用了其创建时的当前线程,而mH是ActivityThread的一个成员变量,所以其创建时的当前线程就是ActivityThread对象生成时的当前线程,ActivityThread对象是在ActivityThread的main函数中生成的,所以onCreate是在主线程。
其他生命周期方法同样是在ActivityThread中通过mH发送消息,并由handleMessage处理的,所以它们和onCreate方法一样,也是运行在主线程。Service的所有生命周期方法和ServiceConnection的回调方法都是运行在主线程的。所以在开发中特别要注意,千万不能在Service的生命周期方法中做非常耗时的操作,否则会引起主线程卡顿,严重时还会引起ANR。