Activity生命周期中我们可以做些什么?
我打赌你一定没搞明白的Activity启动模式
onCreate 被创建时调用
/**
* 1,Activity一被创建便会执行onCreate方法创建,仅会在第一次创建时调用
*
* 2,如果在onSaveInstanceState()方法中曾记录过Activity的状态,savedInstanceState中会保存以前的状态.
*
* 3,之后执行onStart()方法;
*
* 此方法是做所有初始化设置的地方,创建视图,绑定数据等.
*/
onStart 由不可见变为可见时调用
/**
* 1,随着程序是否为用户可见被多次调用
*
* 2,从onStart到onStop 为整个Activity的可视生命周期,
*
* 3,之后执行onResume()方法;
*
* 可以在此进行注册BroadcastReceiver来监控影响UI的改变.或加载一些资源等.
*/
onResume 可见时就会被调用
/**
* 1,此时我们获得焦点可与用户进行交互
*
* 2,前台的生命周期自onResume()直到onPause()为止.在此期间Activity总是可见的.
*
* 3,此时的Activity一定是位于栈顶的.并接受用户的输入.
*
* 4,Activity会经常在暂停与恢复之间进行状态转换.
*
* 之后总会执行onPause()方法;
*/
onPause 可见不可操作时被调用
/**
* 1,当Activity准备去启动另一个Activity时. 在上个Activity的onPause之后才会执行下个Activity的onCreate,所以onPaus不适合执行耗时工作,会影响页面跳转效率
*
* 2,可以在此方法中将未保存的数据进行持久化,或释放掉一些消耗CPU的资源(比如动画)
*
* 3,此方法中执行速度一定要快,下一个活动会等待此方法执行完才会执行.
*
* 当Activity回到前台执行onResume();
* 当Activity变为不可见时执行onStop();
*/
onStop 完全不可见时被调用
/**
* 1,停滞状态,此时Activity完全不可见,从可见到完全不可见之时被调用
*
* 2,从onStart到onStop 为整个Activity的可视生命周期,随着程序是否为用户可见被多次调用
*
* 3,如果我们在onStart中注册了BroadcastReceiver,可在此方法中进行取消注册.或释放一些资源.
*
* 4,从而保证停滞的Activity占用更少的内存
*
* 如果再次回到前台与用户进行交互则执行onRestart()方法.
* 如果关闭销毁Activity则执行onDestroy()方法;
*/
onRestart 从后台重新回到前台时被调用
/**
* 重新开始
* 此时Activity由完全不可见变为可见之前会被调用(onStop-onRestart-onStart之间被调用)
* 在Activity停止后,在再次启动之前被调用
*
* 之后总会执行onStart()方法;
*/
onDestroy 退出当前Activity时被调用
super.onDestroy();
/**
* 1,销毁Activity之前会被调用
*
* 2,可以在此方法中进行资源的释放以节省内存等.
*
* 可以使用isFinishing()方法区分Activity是被系统销毁或Activity正常结束.
*/
以下不是生命周期
onWindowFocusChanged 窗口获得或失去焦点时被调用
/**
* 1,在可否与用户交互之间调用
*
* 2,可在此方法中获取视图组件的尺寸大小.
*
* 3,总是在onResume之后或onPause之后被调用
*/
onSaveInstanceState 被系统杀死时被调用.
不保证一定被调用,用来在Activity被意外销毁保存UI状态的,不能与数据持久化混为一谈,持久化存储应该在onPause和onStop中实行
/**
* 例如:
* 1,屏幕方向改变时,Activity被销毁再重建;
* 2,当前Activity处于后台,系统资源紧张将其杀死.
* 3,另外,当跳转到其他Activity或者按Home键回到主屏时该方法也会被调用,系统是为了保存当前View组件的状态.
* 4,在onStop之前被调用也可能在onPause()之前.
* tip: 官方文档为it does so before onStop() and possibly before onPause()..
*
* 通常在此方法中保存Activity的一些临时状态.
*/
onRestoreInstanceState Activity被系统杀死后再重建时被调用.
/**
* 例如:
* 1,屏幕方向改变时,Activity被销毁再重建之时;
* 2,当前Activity处于后台,系统资源紧张将其杀死,用户又启动该Activity.
* 3,这两种情况下onRestoreInstanceState都会被调用,在onStart之后.
*
* 在此方法中我们可以进行一些数据的恢复.
*/
不要再onDestroy的时候才进行资源的释放工作,例如一些工作进程的销毁和停止,因为onDestroy执行的时机可能较晚。可根据实际需要,在Activity#onPause/onStop中结合isFinishing的判断来执行
standard 模式
这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。使用场景:大多数Activity。
singleTop 模式
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。使用场景如新闻类或者阅读类App的内容页面。
singleTask 模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。
singleInstance 模式
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。