Android基础之Activity的生命周期
2015-08-09 22:04
701 查看
1 Activity的生命周期图
2 Activity的生命周期调用解析
2.1 半遮挡情况
在启动一个半遮挡Activity或者一个透明的Activity放置在栈顶时,当前Activity才调用onPause(),Dialog对话框不会调用:-->onPause() <--onResume()
2.2 全遮挡情况
在启动一个新的全覆盖的Activity时,当前Activity先调用onPause(),在下一个Activity启动完成后,当前Activity才进入onStop():新的Activity返回到当前Activity时,新的Activity会销毁onDestroy():
2.3 按主菜单键情况
按主菜单键返回桌面时,当前Activity先调用onPause(),再调用onStop(),FirstActivity:-->onPause() -->onStop()
再点击软件返回退出时的Activity时,FirstActivity:
<--onReStart() <--onStart() <--onResume()
3 横竖屏切换
Configuration 这个类描述了设备的所有配置信息,这些配置信息会影响到应用程序检索的资源。横竖屏切换是最常见的影响配置变化的因素,还有其他影响配置的因素有:语言的更改,例如:中英文切换、键盘的可用性等。横竖屏切换:android:configChanges=”orientation” 键盘可用性:android:configChanges=”keyboardHidden” 屏幕大小变化:android:configChanges=”screenSize” 语言的更改:android:configChanges=”locale”
在程序运行时,如果发生Configuration Change会导致当前的Activity被销毁并重新创建,即:先调用onDestroy(),接着调用onCreate()方法。重建的目的是:为了让应用程序通过自动加载可替代资源来适应新的配置。
//启动A ActivityA: onCreate ActivityA: onStart ActivityA: onResume //横屏转竖屏 ActivityA: onPause ActivityA: onSaveInstanceState ActivityA: onStop ActivityA: onDestroy //竖屏转横屏 ActivityA: onCreate ActivityA: onStart ActivityA: onRestoreInstanceState ActivityA: onResume
在Android 3.2之后必须在configChanges中添加screenSize才不会在切屏时重新调用各个生命周期。并执行onConfigurationChanged()方法。
android:configChanges=”orientation|keyboardHidden|screenSize”
例如:云图手机电视的播放页面的设置,禁止切屏时重新调用各个生命周期。
<activity android:name="org.stagex.danmaku.player.FungoPlayerActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:label="@string/app_name" android:launchMode="singleTop" android:screenOrientation="portrait" android:theme="@style/Theme.YuntuTheme.NoTitle.Fullscreen"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/vnd.rn-realmedia" /> <data android:mimeType="video/*" /> <data android:mimeType="video/x-flv" /> <data android:mimeType="video/x-hlv" /> <data android:mimeType="video/x-matroska" /> <data android:mimeType="video/x-msvideo" /> </intent-filter> </activity>
4 状态保存与恢复
4.1 onSaveInstanceState()
(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死;这种情况我们无法保证什么时候发生,系统根据资源紧张程度去调度。(2)在用户改变屏幕方向时,系统先销毁当前的Activity,然后再重建一个新的。
(3)在当前Activity跳转到其他Activity或者按Home键回到主屏,自身退居后台时,为了保存当前窗口各个View组件的状态。
(4)回调在onPause()后,onStop()前。
ActivityA: onCreate ActivityA: onStart ActivityA: onResume //横屏转竖屏 ActivityA: onPause ActivityA: onSaveInstanceState ActivityA: onStop ActivityA: onDestroy
(5)例子
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("key", "Something you just typed"); }
4.2 onRestoreInstanceState()
(1)在Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了此Activity,此方法会被调用;(2)在用户改变屏幕方向时,重建的过程中,此方法会被调用。我们可以重写此方法,以便可以恢复一些临时数据;
(3)回调在onStart()后,onResume()前。
//竖屏转横屏 ActivityA: onCreate ActivityA: onStart ActivityA: onRestoreInstanceState ActivityA: onResume
(3)注意事项:常状态保存和恢复,是在onSaveInstanceState()方法中保存Activity状态、数据;应该在onCreate(Bundle savedInstanceState)中恢复。(由于onRestoreInstanceState()方法不一定执行,效果不是最佳,不采纳)
4.3 注意:保存数据有限
Activity的onSaveInstanceState()方法不是Activity生命周期方法,也不保证一定会被调用。它是用来在Activity被意外销毁时保存UI状态的,只能用于保存临
时性数据,例如UI控件的属性等,不能跟数据的持久化存储混为一谈。持久化存储应该在Activity的onPause()/onStop()中实行,在onCreate(Bundle savedInstanceState)中恢复。
5 测试demo
public class ActivityA extends Activity { private ActivityA _this; private String TAG=ActivityA.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e(TAG,"onCreate"); setContentView(R.layout.activity_a); _this=this; } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Log.e(TAG,"onSaveInstanceState"); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); Log.e(TAG,"onRestoreInstanceState"); } @Override protected void onRestart() { super.onRestart(); Log.e(TAG,"onRestart"); } @Override protected void onStart() { super.onStart(); Log.e(TAG,"onStart"); } @Override protected void onResume() { super.onResume(); Log.e(TAG,"onResume"); } @Override protected void onPause() { super.onPause(); Log.e(TAG,"onPause"); } @Override protected void onStop() { super.onStop(); Log.e(TAG,"onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.e(TAG,"onDestroy"); } public void startActivityB(View v){ Intent intent=new Intent(_this,ActivityB.class); startActivity(intent); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="startActivityB" android:text="启动ActivityB"/> </LinearLayout>
public class ActivityB extends Activity { private ActivityB _this; private String TAG=ActivityB.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e(TAG,"onCreate"); setContentView(R.layout.activity_b); _this=this; } @Override protected void onRestart() { super.onRestart(); Log.e(TAG,"onRestart"); } @Override protected void onStart() { super.onStart(); Log.e(TAG,"onStart"); } @Override protected void onResume() { super.onResume(); Log.e(TAG,"onResume"); } @Override protected void onPause() { super.onPause(); Log.e(TAG,"onPause"); } @Override protected void onStop() { super.onStop(); Log.e(TAG,"onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.e(TAG,"onDestroy"); } public void startActivityB(View v){ Intent intent=new Intent(_this, ActivityB.class); startActivity(intent); } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="startActivityB" android:text="启动ActivityA" /> </LinearLayout>
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories