旋转屏幕重新加载Activity
来源:互联网 发布:删除windows.old文件夹 编辑:程序博客网 时间:2024/06/06 03:59
在启动一个acitivity之后,旋转一下屏幕(从竖屏模式切换到横屏模式,或者反过来),尤其是带有侧滑键盘的机型打开滑动键盘时,如果屏幕为竖屏模式,则屏幕会被强制切换到横屏模式。当屏幕显示模式发生变化时,由于横竖屏显示模式存在一些明显的区别,Android系统会认为当前activity显示内容已经不再适合新的屏幕显示模式,所以它会重新加载当前的activity,选择合适的资源以适应新的屏幕显示模式。下面通过一个简单的例子跟踪Acitivity生命周期的变化。
新建一个工程,包含两个Activity分别为DemoParentActivity和DemoChildActivity,在第一个Activity中添加一个可以跳转到第二个Activity的按钮,并分别实现它们的生命周期函数,在函数里面打印一些日志信息,观察Activity生命周期函数调用情况。
ActivityTestActivity.class的代码:
完成了工程代码之后,在eclipse中直接运行工程启动ActivityTestActivity,然后旋转手机(模拟器可以通过CTR+F11组合键进行横竖屏切换),可以从下图打印的日志中看到,当旋转手机屏幕后,DemoParentActivity被销毁后,又被重新加载了一次,同时还可以看到Activity的onSaveInstanceState和onRestoreInstanceState方法也被调用了,这就说明需要在切换屏幕显示模式时,通过这两个方法保存和恢复临时数据。
旋转手机屏幕只会造成当前Activity的重新加载,并不会重新加载整个应用程序。现在有一个问题需要作进一步的分析,就是在旋转手机屏幕后,会不会影响Activity栈中其他的activity。在上面应用程序中,当旋转手机屏幕时,SecondActivity的onConfigurationChanged方法被调用,此时可以进行以下两种不同的操作:
1、通过返回键,返回到ActivityTestActivity
2、再次旋转屏幕之后,通过返回键,返回到ActivityTestActivity
读者可以自行通过查看日志的方式验证,不再赘述。
ActivityTest工程:DEMO
新建一个工程,包含两个Activity分别为DemoParentActivity和DemoChildActivity,在第一个Activity中添加一个可以跳转到第二个Activity的按钮,并分别实现它们的生命周期函数,在函数里面打印一些日志信息,观察Activity生命周期函数调用情况。
ActivityTestActivity.class的代码:
01package com.devdiv.test.activitytest;02 03 04import android.app.Activity;05import android.content.Intent;06import android.content.res.Configuration;07import android.os.Bundle;08import android.util.Log;09import android.view.View;10 11public class ActivityTestActivity extends Activity {12 /** Called when the activity is first created. */13 @Override14 public void onCreate(Bundle savedInstanceState) {15 super.onCreate(savedInstanceState);16 setContentView(R.layout.main);17 18 19 if (savedInstanceState == null) {20 Log.d("test", "ActivityTestActivity - onCreate()");21 } else {22 Log.d("test","ActivityTestActivity - onCreate() with a supplied savedInstanceState");23 }24 }25 26 @Override27 public void onConfigurationChanged(Configuration newConfig) {28 // TODO Auto-generated method stub29 super.onConfigurationChanged(newConfig);30 Log.d("test", "ActivityTestActivity - onConfigurationChanged()");31 }32 33 @Override34 protected void onDestroy() {35 // TODO Auto-generated method stub36 super.onDestroy();37 Log.d("test", "ActivityTestActivity - onDestroy()");38 }39 40 @Override41 protected void onPause() {42 // TODO Auto-generated method stub43 super.onPause();44 Log.d("test", "ActivityTestActivity - onPause()");45 }46 47 @Override48 protected void onRestart() {49 // TODO Auto-generated method stub50 super.onRestart();51 Log.d("test", "ActivityTestActivity - onRestart()");52 }53 54 @Override55 protected void onRestoreInstanceState(Bundle savedInstanceState) {56 // TODO Auto-generated method stub57 super.onRestoreInstanceState(savedInstanceState);58 Log.d("test", "ActivityTestActivity - onRestoreInstanceState()");59 }60 61 @Override62 protected void onResume() {63 // TODO Auto-generated method stub64 super.onResume();65 Log.d("test", "ActivityTestActivity - onResume()");66 }67 68 @Override69 protected void onSaveInstanceState(Bundle outState) {70 // TODO Auto-generated method stub71 super.onSaveInstanceState(outState);72 Log.d("test", "ActivityTestActivity - onSaveInstanceState()");73 }74 75 @Override76 protected void onStart() {77 // TODO Auto-generated method stub78 super.onStart();79 Log.d("test", "ActivityTestActivity - onStart()");80 }81 82 @Override83 protected void onStop() {84 // TODO Auto-generated method stub85 super.onStop();86 Log.d("test", "ActivityTestActivity - onStop()");87 }88 89 public void onButtonClick(View v) {90 Intent mIntent = new Intent(this, SecondActivity.class);91 startActivity(mIntent);92 }93 94 95}
SecondActivity.class的代码:
01package com.devdiv.test.activitytest;02 03 04import android.app.Activity;05import android.content.Intent;06import android.content.res.Configuration;07import android.os.Bundle;08import android.util.Log;09import android.view.View;10 11public class ActivityTestActivity extends Activity {12 /** Called when the activity is first created. */13 @Override14 public void onCreate(Bundle savedInstanceState) {15 super.onCreate(savedInstanceState);16 setContentView(R.layout.main);17 18 19 if (savedInstanceState == null) {20 Log.d("test", "ActivityTestActivity - onCreate()");21 } else {22 Log.d("test","ActivityTestActivity - onCreate() with a supplied savedInstanceState");23 }24 }25 26 @Override27 public void onConfigurationChanged(Configuration newConfig) {28 // TODO Auto-generated method stub29 super.onConfigurationChanged(newConfig);30 Log.d("test", "ActivityTestActivity - onConfigurationChanged()");31 }32 33 @Override34 protected void onDestroy() {35 // TODO Auto-generated method stub36 super.onDestroy();37 Log.d("test", "ActivityTestActivity - onDestroy()");38 }39 40 @Override41 protected void onPause() {42 // TODO Auto-generated method stub43 super.onPause();44 Log.d("test", "ActivityTestActivity - onPause()");45 }46 47 @Override48 protected void onRestart() {49 // TODO Auto-generated method stub50 super.onRestart();51 Log.d("test", "ActivityTestActivity - onRestart()");52 }53 54 @Override55 protected void onRestoreInstanceState(Bundle savedInstanceState) {56 // TODO Auto-generated method stub57 super.onRestoreInstanceState(savedInstanceState);58 Log.d("test", "ActivityTestActivity - onRestoreInstanceState()");59 }60 61 @Override62 protected void onResume() {63 // TODO Auto-generated method stub64 super.onResume();65 Log.d("test", "ActivityTestActivity - onResume()");66 }67 68 @Override69 protected void onSaveInstanceState(Bundle outState) {70 // TODO Auto-generated method stub71 super.onSaveInstanceState(outState);72 Log.d("test", "ActivityTestActivity - onSaveInstanceState()");73 }74 75 @Override76 protected void onStart() {77 // TODO Auto-generated method stub78 super.onStart();79 Log.d("test", "ActivityTestActivity - onStart()");80 }81 82 @Override83 protected void onStop() {84 // TODO Auto-generated method stub85 super.onStop();86 Log.d("test", "ActivityTestActivity - onStop()");87 }88 89 public void onButtonClick(View v) {90 Intent mIntent = new Intent(this, SecondActivity.class);91 startActivity(mIntent);92 }93 94 95} SecondActivity.class的代码:01package com.devdiv.test.activitytest;02 03import android.app.Activity;04import android.content.res.Configuration;05import android.os.Bundle;06import android.util.Log;07 08public class SecondActivity extends Activity {09 10 /** Called when the activity is first created. */11 @Override12 public void onCreate(Bundle savedInstanceState) {13 super.onCreate(savedInstanceState);14 setContentView(R.layout.second);15 16 17 if (savedInstanceState == null) {18 Log.d("test", "SecondActivity - onCreate()");19 } else {20 Log.d("test","SecondActivity - onCreate() with a supplied savedInstanceState");21 }22 }23 24 @Override25 public void onConfigurationChanged(Configuration newConfig) {26 // TODO Auto-generated method stub27 super.onConfigurationChanged(newConfig);28 Log.d("test", "SecondActivity - onConfigurationChanged()");29 }30 31 @Override32 protected void onDestroy() {33 // TODO Auto-generated method stub34 super.onDestroy();35 Log.d("test", "SecondActivity - onDestroy()");36 }37 38 @Override39 protected void onPause() {40 // TODO Auto-generated method stub41 super.onPause();42 Log.d("test", "SecondActivity - onPause()");43 }44 45 @Override46 protected void onRestart() {47 // TODO Auto-generated method stub48 super.onRestart();49 Log.d("test", "SecondActivity - onRestart()");50 }51 52 @Override53 protected void onRestoreInstanceState(Bundle savedInstanceState) {54 // TODO Auto-generated method stub55 super.onRestoreInstanceState(savedInstanceState);56 Log.d("test", "SecondActivity - onRestoreInstanceState()");57 }58 59 @Override60 protected void onResume() {61 // TODO Auto-generated method stub62 super.onResume();63 Log.d("test", "SecondActivity - onResume()");64 }65 66 @Override67 protected void onSaveInstanceState(Bundle outState) {68 // TODO Auto-generated method stub69 super.onSaveInstanceState(outState);70 Log.d("test", "SecondActivity - onSaveInstanceState()");71 }72 73 @Override74 protected void onStart() {75 // TODO Auto-generated method stub76 super.onStart();77 Log.d("test", "SecondActivity - onStart()");78 }79 80 @Override81 protected void onStop() {82 // TODO Auto-generated method stub83 super.onStop();84 Log.d("test", "SecondActivity - onStop()");85 }86 87 88}
完成了工程代码之后,在eclipse中直接运行工程启动ActivityTestActivity,然后旋转手机(模拟器可以通过CTR+F11组合键进行横竖屏切换),可以从下图打印的日志中看到,当旋转手机屏幕后,DemoParentActivity被销毁后,又被重新加载了一次,同时还可以看到Activity的onSaveInstanceState和onRestoreInstanceState方法也被调用了,这就说明需要在切换屏幕显示模式时,通过这两个方法保存和恢复临时数据。
图1 模拟器LogCat日志信息
某些情况下,并不希望在旋转屏幕时Activity被重新加载,这时可以通过修改Android应用工程的Androidmanifest.xml文件中Activity节点的android:configChanges属性,通常需要把这个属性设置为android:configChanges="orientation|navigation|keyboardHidden",这表示当屏幕旋转,页面转换以及键盘隐藏时都不要重新加载Activity,而是调用onConfigurationChanged方法。在上面的代码中可以看到SecondActivity覆盖了Activity的onConfigurationChanged方法,并设置了activity的android:configChanges属性。
接下来点击按钮来启动SecondActivity,然后旋转屏幕再看一下输出的日志信息,从图2-11中可以清楚的看到,当切换屏幕显示模式时,SecondActivity并没有被重新加载,只是调用了它的onConfigurationChanged()方法,如果并不希望在旋转屏幕时Activity被重新加载,那么需要实现Activity的onConfigurationChanged方法进行添加相应的的处理逻辑。
图2 模拟器LogCat日志信息
旋转手机屏幕只会造成当前Activity的重新加载,并不会重新加载整个应用程序。现在有一个问题需要作进一步的分析,就是在旋转手机屏幕后,会不会影响Activity栈中其他的activity。在上面应用程序中,当旋转手机屏幕时,SecondActivity的onConfigurationChanged方法被调用,此时可以进行以下两种不同的操作:
1、通过返回键,返回到ActivityTestActivity
2、再次旋转屏幕之后,通过返回键,返回到ActivityTestActivity
读者可以自行通过查看日志的方式验证,不再赘述。
ActivityTest工程:DEMO
- 旋转屏幕重新加载Activity
- 屏幕旋转时防Activity重新加载
- Android 4.0: 旋转屏幕时禁止Activity重新加载
- 安卓屏幕旋转时,禁止Activity重新加载
- Android:屏幕旋转时,禁止Activity重新加载
- ANDROID竖屏,屏幕旋转禁止重新加载activity
- Activity 屏幕能够旋转,但不会重新加载
- Android禁止屏幕旋转,旋转屏幕时不重新加载当前activity
- Android禁止屏幕旋转,旋转屏幕时不重新加载当前activity
- Android禁止屏幕旋转,旋转屏幕时不重新加载当前activity
- 【Android】禁止屏幕旋转,旋转屏幕时不重新加载当前activity
- 禁止屏幕旋转重新加载oncreat
- Android屏幕旋转不重新加载布局
- Android屏幕旋转时,设置Activity不重新调用onCreate
- android屏幕旋转时,禁止重新加载(onCreate)
- android webview旋转屏幕导致页面重新加载问题
- 关于Android Activity的configChanges属性的用法,设置屏幕旋转时activity不重新创建
- android屏幕旋转时,Activity不重新调用onCreate的方法
- Linux下防止进程使用swap及防止OOM机制导致进程被kill掉
- 中国民族下拉框
- 再次深入理解win32控制台
- 金山笔试题 C++
- 个人配置
- 旋转屏幕重新加载Activity
- C#形参,实参,值传递参数,引用传递参数,输出参数,参数数组的学习(一)
- 小执着的伤感空间日志:童话般虚幻、却没有童话般的结局
- C 可变参数宏
- 教你用grub4dos定制自己的启动U盘
- 牵手是伤,放手是痛:伤感QQ空间日志
- Spring Test 整合 JUnit 4 使用总结
- Android开发之多个Activity跳转(Intent)及菜单用法(menu)
- hibernate缓存相关