Activity是什么?
Activity是用于与用户进行交互的界面组件,有自己的生命周期。界面组件除了Activity之外,还有Window、Dialog和Toast。
Activity的生命周期
一个Activity在进程中有不同的状态,如running/paused/stopped/killed。这里的生命周期,是指当Activity进入某种状态时会调用的一些函数。
当一个Activity被启动,执行OnCreate->OnStart->OnResume
当一个可交互状态的Activity被Dialog或一个窗口型Activity遮挡,执行OnPause
当一个可交互状态的Activity被完全遮挡,如启动了一个新Activity挡住当前Activity,则当前Activity执行OnPause->OnStop
当一个Activity被系统回收掉或者手动调用activity.finish();时,执行OnDestroy
onCreate:Activity被创建完成时调用
onStart:Activity已经开始运行时调用
onResume:Activity可以与用户交互时调用
OnPause:Activity无法与用户交互时调用
OnStop:Activity不可见时调用
OnDestroy:Activity被销毁前调用
Android中进程优先级
理解优先级之前需要理解进程的概念,进程的优先级可分为:前台进程->可见进程->服务进程->后台进程->空进程
前台进程:当前用户正在操作的Activity所属的进程
可见进程:当前用户还可以看到的Activity所属的进程
服务进程:Service所运行的进程
后台进程:不可见的Activty所属进程
空进程:什么都没有的进程,用于启动新进程时被重新使用。
老生常谈Activity启动模式
根据activity的不同应用场景,我们有时对启动一个Activity有一些特殊的要求……
使用示例:
Manifest.xml中
<activity
android:name=".MainActivity" android:launchMode="standard" />
standard:标准启动模式,该模式下启动一个Activity,每次都会生成一个新的实例置于Activity栈栈顶。
singleTop:栈顶复用模式,该模式下启动一个Activity,若此时Activity栈栈顶存在该Activity类的实例,则复用该实例。否则,生成一个新的实例置于Activity栈栈顶。
singleTask:栈内复用模式,该模式下启动一个Activity,若此时Activity栈栈中存在该Activity类的实例,则复用该实例,并将该实例在栈中之上的Activity全部弹出。否则,生成一个新的实例置于Activity栈栈顶。
singleInstance:单实例模式,该模式下的Activity独享一个Activity栈,且系统中所有进程共享该栈以及栈中Activity。
Activity启动Flags
Intent.FLAG_ACTIVITY_NEW_TASK (默认)
默认的跳转类型,根据AndroidManifest.xml中Activity的Affinity创建一个新的Activity,存放在Affinity对应的栈中。FLAG_ACTIVITY_SINGLE_TOP
这个FLAG就相当于启动模式中的singletop。FLAG_ACTIVITY_CLEAR_TOP
这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。(SingleTop启动模式实现了该Flags)FLAG_ACTIVITY_NO_HISTORY
用这个FLAG启动的Activity不会被存放到栈中。
Activity数据保存
- Activty处于onPause和onStop时随时可能被系统回收,但是Android提供了Activity两个回调方法:
onSaveInstanceState()和onRestoreInstanceState()。
onSaveInstanceState:默认会保存UI控件状态,如果需要保存一些变量的值,则需要覆写该方法(注意调用super.onSaveInstanceState(outState);outState是一个Bundle,可以用来存储可序列化的对象或基本类型(键值对))。
onRestoreInstanceState:默认恢复UI控件状态,恢复变量值操作同上。 - 由于onSaveInstanceState不一定能被调用(如手动调用activity.finish())所以若想做数据持久化(即数据永久保存)则可在onPause()中利用SharedPrefence、SQLite或文件来保存。
Activity的横竖屏切换
android:screenOrientation=”portrait”
则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。
android:screenOrientation=”landscape“,为横屏显示。关于切换时生命周期的变化,转载自横竖屏切换时候Activity的生命周期的总结中四楼的评论
刚启动
I/aaa: onCreate
I/aaa: onStart
I/aaa: onResume
切成横屏
I/aaa: onConfigurationChanged
I/aaa: onPause
I/aaa: onStop
I/aaa: onDestroy
I/aaa: onCreate
I/aaa: onStart
I/aaa: onRestoreInstanceState
I/aaa: onResume
切回竖屏
I/aaa: onConfigurationChanged
再切横,又是上面那一坨
再切竖,只有一个onConfigurationChangedAndroid 23上的表现,with android:configChanges=”orientation” or android:configChanges=”orientation|keyboardHidden“
如果没有设android:configChanges,无论切横还是竖,都是切成横屏那一坨。