Android的四大组件之Activity
Android的四大组件之Activity
Activity:是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器)之一。Activity提供一个屏幕,用户交互的界面。
“Activity (这个觉得没必要翻译,直接用还好理解 @ Sam )就提供与用户交互的界面,用户通过这个交互界面可以进行一些操作,比如打电话、照相、发邮件或查看地图。每一个 Activity 都提供了一个可以绘制用户交互界面的窗体,这个窗体通知充满整个屏幕,但也可以是小于屏幕或悬浮于其它窗体上。”---from: sam_zhang1984
Activity的生命周期:--------------------------------------------------------------------------------
onCreate()--->onStart()--->onResume()--->onPause()--->onStop()--->onDestroy()
说明:启动Activity时会先执行onCreate()--->onStart()--->onResume();
当该Activity被一个透明的界面或者不是全屏的界面覆盖时,由于此时该Activity仍然处于可见状态,所以,该Activity会执行onPause()方法进入暂停状态,此时重启该Activity时只需要执行onResume();
当该Activity被完全覆盖或者用户按下home键、锁屏等操作时,该Activity会执行onPause()--->onStop()方法,该Activity进入停止状态,此时重启Activity时需要执行onStart()--->onResume();
当处于onStop()或者onPause()状态的Activity由于内存不足或者其他因素,杀死该Activity,重启该Activity时则需要调用onCreate()--->onStart()--->onResume()。
Activity在横竖屏切换状态下声明周期的变化---------------------------------------------------------
运行Activity,onCreate()--->onStart()---->onResume();
竖屏切换成横屏时:onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume();黄色阴影部分是竖屏状态下的Activity的生命周期变化。
横屏再切换到竖屏时:onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()--->onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume();我们发现这里生命周期执行了两次,这当然不是我们希望的结果,那我们如何优化:
1、在AndroidManifest.xml中,对该Activity添加 android:configChanges="orientation",然后竖屏切换到横屏时生命周期变化:onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume();
横屏切换到竖屏时:onSaveInstanceState()--->onPause()--->onStop()--->onDestroy()--->onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()--->onConfigurationChanged();此时,会发现,生命周期并没有像之前那样执行两次,但是多执行了一个onConfigurationChanged()方法。
2、在AndroidManifest.xml中,对该Activity添加 android:configChanges="orientation|keyboardHidden",竖屏切换到横屏时,生命周期只执行:onConfigChanged()--->onConfigurationChanged();
横屏切换回竖屏时:onConfigurationChanged()--->onConfigurationChanged();
总结:
①不设置Activity的android:configChanges时,切屏回重新调用各个生命周期,竖屏切换成横屏时生命周期执行一次,横屏切换成竖屏时生命周期回执行两次。
②在AndroidManifest.xml中,对Activity添加 android:configChanges="orientation"时,切屏会执行生命周期,并且横竖屏切换都只会执行一次
③在AndroidManifest.xml中,对该Activity添加 android:configChanges="orientation|keyboardHidden",切屏时不会重新调用各个生命周期,只会执行onConfigurationChanged()方法
Activity的启动方式-------------------------------------------------------------------------------------
standard:Android默认的启动模式,每次都会创建新的Activity实例并push到任务栈中。可以有多个实例。
singleTop:单顶模式,也叫栈顶复用模式。启动某个Activity时,如果目标任务栈中存在该Activity实例并且位于栈顶时,就不会再创建新的Activity实例,而是直接使用栈顶的Activity。不位于栈顶则需要创建新的实例,可以有多个实例。
singleTask:单任务模式。整个任务栈中只会存在一个Activity实例。使用时,如果该Activity的实例已经存在且不在栈顶,则会销毁该Activity之上的所有Activity,直接使用该Activity。只有一个实例。
singleInstance:单例模式。跟singleTop很相似,区别是singleInstance模式下的Activity会创建一个新的任务栈,独立于当前的任务栈存在。
保存Activity的运行状态----------------------------------------------------------------------------------
Activity在暂停或者停止状态时,关于它的成员信息和当前状态都是存活的,所以可以保存Activity的状态。
当Activity销毁时,系统就无法恢复其状态,用户调用这个Activity时会创建一个新的Activity对象。这种情况下要保存Activity的状态就需要调用重写onSaveInstanceState()这个方法,该方法在Activity销毁前调用,并且会传进一个Bundle对象,可以使用Bundle对象的putString()之类的方法在Bundle对象中以键值对的形式保存状态信息。这个时候,即使Activity被销毁了,当你重新调用时会重新获取该Activity之前的状态。onSaveInstanceState()方法一般是在onStop之前onPause之后调用。
注:因为很多情况下是不需要保存 activity 的状态信息的(比如用户按了返回键就是想关闭当前 activity ),所以并不能保证在你的 activity 被销毁前一定会调用 onSaveInstanceState() 方法,因此我们应该只是用它来保存一些 activity 的转换过程状态(即 UI 的状态),而不能用来保存永久性数据。但是可以用 onPause 方法在用户离开 activity 时来保存永久性数据,比如需要保存到数据库的数据。
SiberiaDante的github地址:https://github.com/SiberiaDante