美文网首页Android专题Android面试题解析
面试题:Activity横竖屏切换时的生命周期如何变化

面试题:Activity横竖屏切换时的生命周期如何变化

作者: 千夜零一 | 来源:发表于2020-09-21 10:39 被阅读0次

    引言

      看视频时经常用到横竖屏切换时,你有没有了解过,这时候的activity生命周期如何变换?切换横竖屏监听变化需要用到activity的属性:configChanges属性,用于监听屏幕的横竖屏切换事件。

    效果

    切换横竖屏.gif

    介绍

      android:configChanges,用于捕获手机状态的改变,当横竖屏切换,屏幕尺寸变化,弹出键盘,系统设置改变等条件,就会触发回调事件onConfigurationChanged。

    属性值

    mcc:移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家;

    mnc:移动网号,在一个国家或者地区中,用于区分手机用户的服务商;

    locale:用户所在地区发生变化;

    touchscreen:触摸屏幕变化;

    keyboard:键盘模式发生变化,例如:用户接入外部键盘输入;

    keyboardHidden:用户打开手机硬件键盘;

    navigation:导航类型改变;

    orientation:设备旋转,横向显示和竖向显示模式切换;

    fontScale:全局字体大小缩放发生改变。

    用法

    第一步:在manifest中配置activity属性

    <activity android:name=".blog.Case30"
                android:configChanges="orientation|keyboard|layoutDirection|screenSize">
                <!--activity横竖屏切换-->
            </activity>
    

      我这个activity不是main所以不设置<intent-filter>属性,如果是首发,其他不用修改,加上android:configChanges="orientation|keyboard|layoutDirection|screenSize">即可。
    此时属于第四种结果,无法在logcat中显示生命周期变化情况,只执行重写的onConfigurationChanged方法。

    第二步:重写onConfigurationChanged()方法。

    //重写该方法
        @Override
        public void onConfigurationChanged(@NonNull Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {       //横屏
                Toast.makeText(this, "横屏", Toast.LENGTH_SHORT).show();
            } else { //newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE  //竖屏
                Toast.makeText(this, "竖屏", Toast.LENGTH_SHORT).show();
            }
        }
    

    第三步:重写一系列activity的生命周期方法,打印在控制台,看它们如何变化。

    @Override
        protected void onStart() {
            super.onStart();
            Log.i( "armstrong","==>>onStart()");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.i( "armstrong","==>>onResume()");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.i( "armstrong","==>>onPause()");
        }
        
        @Override
        protected void onStop() {
            super.onStop();
            Log.i( "armstrong","==>>onStop()");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.i( "armstrong","==>>onDestroy()");
        }
    

    结果

    (1) 不给activity设置activity:configChanges属性时的生命周期变化情况。

    刚开始竖屏调用方法顺序:

    ==>>onStart()

    ==>>onResume()

    变为横屏时的生命周期变化:

    ==>>onPause()

    ==>>onStop()

    ==>>onDestory() //调用完整生命周期一次

    ==>>onStart()

    ==>>onResume()

    重新变为竖屏时的生命周期变化:

    ==>>onPause()

    ==>>onStop()

    ==>>onDestory() //调用完整生命周期二次

    ==>>onStart()

    ==>>onResume()

    退出activity时生命周期变化:

    ==>>onPause()

    ==>>onStop()

    ==>>onDestory() //调用完整生命周期三次

      总结:横屏调用完整生命周期一次,竖屏调用两次。

    (2)给activity设置android:configChanges="orientation"属性时的生命周期变化情况。

      总结:也是横屏调用完整生命周期1次,竖屏调用2次。

    (3)给activity设置android:configChanges="orientation |keyboardHidden"属性时的生命周期变化情况。

      总结:也是横屏调用完整生命周期1次,竖屏调用2次。

    (4)给activity设置android:configChanges="orientation|keyboard|layoutDirection|screenSize"属性时的生命周期变化情况。

      总结:横竖屏切换时不会调用各个生命周期方法。只会执行onConfigurationChanged方法,弹出Toast消息提示用户。

    相关文章

      网友评论

        本文标题:面试题:Activity横竖屏切换时的生命周期如何变化

        本文链接:https://www.haomeiwen.com/subject/pnxvyktx.html