横竖屏切换时页面信息的处理流程及方法

转自:android实现在横竖屏切换时页面信息不被重置的示例分享Android脚本之家 http://www.jb51.net/article/47059.htm

亲测结果(只测试了横竖屏切换):

配置文件声明:


<activity
            android:name=".MainActivity "
            android:configChanges="orientation"/>

activity代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.d("MainActivity ","进入onCreate");

    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        // 一定要先调用父类的同名函数,让框架默认函数先处理
        // 下面这句一定不能省去,否则将引发:android.app.SuperNotCalledException 异常。
        super.onConfigurationChanged(newConfig);
        Log.d("MainActivity ","进入onConfigurationChanged");
        if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE )
        {
            // 当前为横屏
            Log.d("MainActivity ","当前为横屏");

        }else if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
        {
            //当前为竖屏
            Log.d("MainActivity ","当前为竖屏");

        }
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("MainActivity ","进入onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d("MainActivity ","进入onResume");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d("MainActivity ","进入onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d("MainActivity ","进入onDestroy");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d("MainActivity ","进入onRestart");
    }
}

总结:

1.不在配置文件声明configChanges的话,则并不会进入onConfigurationChanged()函数,这时的运行结果为:
每切换一次方向,就会重新走一次流程;

2.在配置文件声明configChanges后:
并不会载重新走一次流程,而是只进入onConfigurationChanged()函数了。

原文如下:

android实现在横竖屏切换时页面信息不被重置的示例分享

当屏幕转动切换的时候 Android 机制是:
销毁当前屏幕的 Activity ,然后重新开启一个新的适应屏幕改变的 Activity 。
那么,我们该如何在屏幕切换的时候页面信息不被重置呢?
解决实现:
1.在 AnroidMainifest.xml 的 activity 元素中加入:

android:configChanges=”orientation|keyboardHidden”

android:configChanges=”orientation|keyboard|keyboardHidden”
表示在改变屏幕方向、弹出软件盘和隐藏软键盘时,不再去执行 onCreate() 方法,
而是直接执行 onConfigurationChanged() 。
如果不申明此段代码,按照Activity的生命周期,都会去执行一次 onCreate() 方法,
而 onCreate() 方法通常会在显示之前做一些初始化工作。
所以如果改变屏幕方向这样的操作都去执行 onCreate() 方法,就有可能造成重复的初始化,
降低程序效率是必然的了,而且更有可能因为重复的初始化而导致数据的丢失。
这是需要避免的!
2.权限声明:

API 中说该权限允许我们改变配置信息,但是我们在改变屏幕方向的程序中却并没有用到该权限,是不是相互冲突了呢?
这里我们可以这样认为,当我们声明该权限的的时候,
系统允许我们通过重写 activity 中的 onConfigurationChanged 方法来捕获和修改某些配置信息。
3.在 Java 源代码文件中重写 Activity 中的 onConfigurationChanged 方法:
import android.content.res.Configuration;
// 框架回调函数 onConfigurationChanged 出自 android.content.res.Configuration 包。
// 参数 newConfig - 新设备的配备。
// 当设备配置信息有改动(比如屏幕方向的改变,实体键盘的推开或合上等)时,
// 并且如果此时有 Activity 正在运行,系统会调用这个函数。
// 注意:onConfigurationChanged 只会响应应用程序在 AnroidMainifest.xml 中
//    通过 android:configChanges=”配置类型” 指定的配置类型的改动;
//    而对于其他配置的更改,则系统会先销毁当前屏幕的 Activity ,
//    然后重新开启一个新的适应屏幕改变的 Activity 实例。
public void
onConfigurationChanged( Configuration newConfig )
{
// 一定要先调用父类的同名函数,让框架默认函数先处理
// 下面这句一定不能省去,否则将引发:android.app.SuperNotCalledException 异常。
super.onConfigurationChanged( newConfig );

// 检测屏幕的方向:纵向或横向
if ( this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE )
{
    // 当前为横屏, 在此处添加额外的处理代码
}
else if ( this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
{
    //当前为竖屏, 在此处添加额外的处理代码
}

//检测实体键盘的状态:推出或者合上    
if ( newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO )
{
    // 实体键盘处于推出状态,在此处添加额外的处理代码
}
else if ( newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES )
{
    // 实体键盘处于合上状态,在此处添加额外的处理代码
}

}
一、新建一个 Activity ,并把各个生命周期打印出来:
第一步:
运行 Activity ,得到如下信息:
onCreate
onStart
onResume
第二步:
按 crtl + f12 切换成横屏时:
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
第三步:
再按 crtl + f12 切换成竖屏时,发现打印了两次相同的信息:
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
第四步:
修改 AndroidManifest.xml 文件中的 Activity 元素,
添加 android:configChanges=”orientation” ,
按 crtl + f12 切换成横屏时:(与上面无修改时相同)
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
第五步:
再按 crtl + f12 切换成竖屏时,
发现不会再打印相同信息,
但多打印了一行 onConfigChanged :
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onConfigurationChanged
第六步:
修改 AndroidManifest.xml 文件中的 Activity 元素,

android:configChanges=”orientation”
改成
android:configChanges=”orientation|keyboardHidden”
按 crtl + f12 切换成横屏时,
就只打印 onConfigChanged :
onConfigurationChanged
第七步:
按 crtl + f12 切换成竖屏时:
onConfigurationChanged
onConfigurationChanged
二、总结:
1.不设置 AndroidManifest.xml 文件中的 Activity 元素的 android:configChanges 时,
切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;
2.设置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges=”orientation”时,
切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;
3.设置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges=”orientation|keyboardHidden”时,
切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法!
三、补充一点:
1.当前 Activity 产生事件弹出 Toast 和 AlertDialog 的时候 Activity 的生命周期不会有改变!
2.Activity 运行时按下 home 键(跟被完全覆盖是一样的):
onSaveInstanceState –> onPause –> onStop
onRestart –> onStart –> onResume
3.Activity 未被完全覆盖只是失去焦点:
onPause –> onResume

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值