android activity横竖屏切换,Activity重新创建问题解决!

activityA和B A跳转到B

1:在主配置文件中添加Bactivity,如果不想B在横竖屏切换的时候导致activity的销毁和重新创建;可在声明activity中添加

android:configChanges="keyboardHidden|orientation"

  1. <!-- android:configChanges="keyboardHidden|orientation" 禁止activity在横竖屏的时候activity被重新创建或者重启,导致数据丢失,在游戏制作中尤为重要 -->  
  2.        <activity  
  3.            android:name=".DemoActivity"  
  4.            android:configChanges="keyboardHidden|orientation"  
  5.            android:theme="@android:style/Theme.Dialog" />  
  6.        <!-- android:theme="@android:style/Theme.Dialog" 设置该activity的显示样式是一对话框的形式显示 -->  


2:在A的配置文件中添加一个按钮.和单击事件

3:重写A中父类的onCreate onDestroy onPause onRestart onResume onStart onStop 方法,并添加system.out的TAG

为了避免横竖屏和以为一些异常导致activity的销毁和数据丢失,就重写onSaveInstanceState这个方法,该方法可以保存当前页面因为异常导致的activity销毁时候数据,然后在下载onCreate的时候调用者写数据就可以了,onCreate中的参数就是onSaveInstanceState方法中放入的bundle对象

  1. package com.example.lifecycle;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7.   
  8. /** 
  9.  * 声明周期: 一个对象被创建出来 到 被销毁(或者垃圾回收)的这个过程中所必须的方法 
  10.  *  
  11.  * @author w 
  12.  *  
  13.  */  
  14. public class MainActivity extends Activity {  
  15.     /** 
  16.      * A 激活下一个activity之前的页面 B激活下一个activity之后的页面<br> 
  17.      * 程序第一次被部署的时候,执行第一个activity的onCreate onStart onResume 方法<br> 
  18.      * 激活下一个activity 执行A的onPause B onCreate onStart onResume A的 onStop<br> 
  19.      * 在B中点击返回按钮执行B的finidsh onPause A的 onRestart onStart onResume B的 onStop 
  20.      * onDestroy<br> 
  21.      * 在A中点击返回 执行 A的 finish onPause onStop onDestroy <br> 
  22.      * 在A中点击home键 执行A的onPause onStop方法<br> 
  23.      */  
  24.     @Override  
  25.     /** 
  26.      * activity第一次被创建的时候执行,可做一些初始化工作 
  27.      */  
  28.     public void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.main);  
  31.         System.out.println("main onCreate");  
  32.         int page = 0;  
  33.         if (savedInstanceState != null) {// savedInstanceState  
  34.                                             // 接收因异常回收页面传来的bundle值  
  35.             page = savedInstanceState.getInt("page");// 取得传来的bundle中的值  
  36.         }  
  37.         System.out.println("当前: " + page);  
  38.     }  
  39.   
  40.     /** 
  41.      * click点击事件 
  42.      */  
  43.     public void click(View view) {  
  44.         Intent intent = new Intent(this, DemoActivity.class);  
  45.         startActivity(intent);  
  46.     }  
  47.   
  48.     @Override  
  49.     public void finish() {  
  50.         super.finish();  
  51.         System.out.println("main finish");  
  52.     }  
  53.   
  54.     @Override  
  55.     /** 
  56.      * activity被销毁的时候执行的方法 
  57.      */  
  58.     protected void onDestroy() {  
  59.         super.onDestroy();  
  60.         System.out.println("main onDestroy");  
  61.     }  
  62.   
  63.     @Override  
  64.     /** 
  65.      * 当界面失去焦点的时候 
  66.      */  
  67.     protected void onPause() {  
  68.         super.onPause();  
  69.         System.out.println("main onPause");  
  70.     }  
  71.   
  72.     @Override  
  73.     protected void onRestart() {  
  74.         super.onRestart();  
  75.         System.out.println("main onRestart");  
  76.     }  
  77.   
  78.     @Override  
  79.     /** 
  80.      * 界面的控件可以获取焦点的时候 
  81.      */  
  82.     protected void onResume() {  
  83.         super.onResume();  
  84.         System.out.println("main onResume");  
  85.     }  
  86.   
  87.     @Override  
  88.     /** 
  89.      * 当界面可以被用户可见,当用户再次返回该activity的时候,可以用这个方法来做一些数据的更新 
  90.      */  
  91.     protected void onStart() {  
  92.         super.onStart();  
  93.         System.out.println("main onStart");  
  94.     }  
  95.   
  96.     @Override  
  97.     /** 
  98.      * 界面用户完全不可见的时候调用,比如正在看视屏,来一电话,可以用该方法停止播放 
  99.      */  
  100.     protected void onStop() {  
  101.         super.onStop();  
  102.         System.out.println("main onStop");  
  103.     }  
  104.   
  105.     @Override  
  106.     /** 
  107.      * 当activity被异常销毁(回收)的时候调用,如果是自适应屏幕, 
  108.      * 如果是一个阅读器,在看的时候突然没电了,就会调用这个方法,当下次调用者个页面的时候,会调用onCreate方法,并把这个参数的bundle对象传给oncreate方法,<br> 
  109.      * oncreate方法中的bundle参数就是该值 
  110.      */  
  111.     protected void onSaveInstanceState(Bundle outState) {  
  112.         // TODO Auto-generated method stub  
  113.         super.onSaveInstanceState(outState);  
  114.         outState.putInt("page"30);  
  115.     }  
  116.   
  117. }  

4:Bactivity代码

  1. package com.example.lifecycle;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class DemoActivity extends Activity {  
  7.   
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.demo);  
  12.         System.out.println("demo onCreate");  
  13.     }  
  14.   
  15.     @Override  
  16.     public void finish() {  
  17.         super.finish();  
  18.         System.out.println("demo finish");  
  19.     }  
  20.   
  21.     @Override  
  22.     protected void onDestroy() {  
  23.         super.onDestroy();  
  24.         System.out.println("demo onDestroy");  
  25.     }  
  26.   
  27.     @Override  
  28.     protected void onPause() {  
  29.         super.onPause();  
  30.         System.out.println("demo onPause");  
  31.     }  
  32.   
  33.     @Override  
  34.     protected void onRestart() {  
  35.         super.onRestart();  
  36.         System.out.println("demo onRestart");  
  37.     }  
  38.   
  39.     @Override  
  40.     protected void onResume() {  
  41.         super.onResume();  
  42.         System.out.println("demo onResume");  
  43.     }  
  44.   
  45.     @Override  
  46.     protected void onStart() {  
  47.         super.onStart();  
  48.         System.out.println("demo onStart");  
  49.     }  
  50.   
  51.     @Override  
  52.     protected void onStop() {  
  53.         super.onStop();  
  54.         System.out.println("demo onStop");  
  55.     }  
  56. }  


 

注意onSaveInstanceState方法的作用,可以保存activity在因为异常导致销毁时候的数据,然后传给onCreate方法,在做处理,就可以避免数据的错乱,

例如 在看小说的时候切换了横竖屏,在切换的时候会调用onCreate onStart onResume 那么activity中的当前页数就丢了,用得从新开始,如果重写了onSaveInstanceState方法,把当前页放到参数bundle中,在onCreate的时候,onCreate中的参数bundle就是onSaveInstanceState方法中的bundle对象,然后判断onCreate参数bundle是否有值,如果有就取出对应的key值,如果是取出在切换前的当前页数,在判断不为空的时候 可以把页数直接定位到该页,这样就可以接着看了

在声明的activity中添加  android:configChanges="keyboardHidden|orientation" 属性 可以禁止activity在横竖屏的时候activity被重新创建或者重启,导致数据丢失,在游戏制作中尤为重要


通过设置这个属性可以使Activity捕捉设备状态变化,以下是可以被识别的内容:  
CONFIG_FONT_SCALE
CONFIG_MCC
CONFIG_MNC
CONFIG_LOCALE
CONFIG_TOUCHSCREEN
CONFIG_KEYBOARD
CONFIG_NAVIGATION
CONFIG_ORIENTATION

设置方法:将下列字段用“|”符号分隔开,例如:“locale|navigation|orientation

ValueDescription
“mcc“The IMSI mobile country code (MCC) has changed — that is, a SIM hasbeen detected and updated the MCC.移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“The IMSI mobile network code (MNC) has changed — that is, a SIM hasbeen detected and updated the MNC.移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“The locale has changed — for example, the user has selected a new language that text should be displayed in.用户所在地区发生变化。
“touchscreen“The touchscreen has changed. (This should never normally happen.)
“keyboard“The keyboard type has changed — for example, the user has plugged in an external keyboard.键盘模式发生变化,例如:用户接入外部键盘输入
“keyboardHidden“The keyboard accessibility has changed — for example, the user has slid the keyboard out to expose it.用户打开手机硬件键盘
“navigation“The navigation type has changed. (This should never normally happen.)
“orientation“The screen orientation has changed — that is, the user has rotated the device.设备旋转,横向显示和竖向显示模式切换。
“fontScale“The font scaling factor has changed — that is, the user has selected a new global font size.全局字体大小缩放发生改变


转载于:https://www.cnblogs.com/xieyuan/p/3787343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值