关于阅读_关于Android横竖屏切换及Activity重启周期的总结

更新时间:2019-12-25    来源:班主任工作总结    手机版     字体:

【www.bbyears.com--班主任工作总结】

禁止Android横竖屏和解决切换屏幕时重启Activity的方法

1.在AndroidManifest.xml的Activity配置中加入 android:screenOrientation=”landscape”属性(landscape是横向,portrait是纵向)。如:

    
        
        
    

        
2.一般横竖屏切换时,activity要重启,为了避免重启,可以为activity 添加android:configChanges=“orientation”属性,然后在activity中复写onConfigurationChanged()方法,例如:

public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) {
        setContentView(R.layout.imageswitch);
        //横屏
    } else {
        setContentView(R.layout.editcontact);//竖屏
    }
    
    super.onConfigurationChanged(newConfig);
}


这样就可以实现不重启activity,实现横竖屏切换了。



解决Android手机 屏幕横竖屏切换

Android中当屏幕横竖屏切换时,Activity的生命周期是重新加载(说明当前的Activity给销毁了,但又重新执行加载),怎么使屏幕横竖屏切换时,当前的Activity不销毁呢?

1. 在AndroidManifest.xml中为Activity设置configChanges属性,

application android:icon="@drawable/icon" android:label="@string/app_name">







configChanges有如下选项:  1. orientation :屏幕在纵向和横向间旋转,  2. keyboardHidden:键盘显示或隐藏 ,3.fontScale:用户变更了首选的字体大小   4.locale : 用户选择了不同的语言设定,5.  keyboard :键盘类型变更,例如手机从12键盘切换到全键盘   6. touchscreen或navigation:键盘或导航方式变化,

如果缺少了keyboardHidden选项 不能防止Activity的销毁,并且在之后提到的onConfigurationChanged事件中 只能捕获竖屏变横屏的事件 不能捕获横屏变竖屏


2. 在对应的Activity中重写:onConfigurationChanged 方法:

public class MainActivity extends Activity {
    private TextView textView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i("--Main--", "onCreate");
        textView=(TextView)findViewById(R.id.tv_id);
    }
    
    
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i("--Main--", "onConfigurationChanged");
        if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
            textView.setText("当前屏幕为横屏");
        }else{
            textView.setText("当前屏幕为竖屏");
        }
    }
    
}



布局文件就是一个简单的TextView此处不给出,

效果如下:

日志打印:


从日志中可以分析出屏幕横竖屏切换时Activity并没有销毁,当然你也可以运行项目在onCreate方法打个断点,执行发现onCreate方法只是在刚开始进入时执行,屏幕横竖屏切换时,已经不会在执行,因此可在onConfigurationChanged方法中下点文章!

注:如果项目不需要屏幕切换时可以设置为

1. android:screenOrientation="portrait" 始终以竖屏显示
2. android:screenOrientation="landscape" 始终以横屏显示

上面的配置文件设置屏幕横竖屏,下面是代码去控制屏幕横竖屏的:

private OnClickListener onClick=new OnClickListener() {
    @Override
    public void onClick(View v) {
        //设置屏幕为横屏
        if(v==butLandscrpe){
            MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        //设置为置屏幕为竖屏
        }else{
            MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
    }
};
//监听系统设置的更改
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    String message=newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE ? "屏幕设置为:横屏" : "屏幕设置为:竖屏";
    showToast(message);
}




横竖屏切换时候Activity的生命周期

1、新建一个Activity,并把各个生命周期打印出来
2、运行Activity,得到如下信息
onCreate-->onStart-->onResume-->
3、按crtl+f12切换成横屏时
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
4、再按crtl+f12切换成竖屏时,发现打印了两次相同的log
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
5、修改AndroidManifest.xml,把该Activity添加 android:configChanges="orientation",执行步骤3
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->
6、再执行步骤4,发现不会再打印相同信息,但多打印了一行onConfigChanged
onSaveInstanceState-->onPause-->onStop-->onDestroy-->onCreate-->onStart-->onRestoreInstanceState-->onResume-->onConfigurationChanged-->
7、把步骤5的android:configChanges="orientation" 改成 android:configChanges="orientation|keyboardHidden",执行步骤3,就只打印onConfigChanged
onConfigurationChanged-->
8、执行步骤4
onConfigurationChanged-->onConfigurationChanged-->
 总结:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
 

总结一下整个Activity的生命周期
补充一点,当前Activity产生事件弹出Toast和AlertDialog的时候Activity的生命周期不会有改变
Activity运行时按下HOME键(跟被完全覆盖是一样的):onSaveInstanceState --> onPause --> onStop      onRestart -->onStart--->onResume
Activity未被完全覆盖只是失去焦点:onPause--->onResume


如何让Android横竖屏切换时不销毁当前activity

我们都知道android 屏幕横向或竖向相互转换的时候会销毁当前的Activity 然后重启它。
为了横竖屏切换时不销毁当前Activity 我来介绍两种方法。

方法一:不允许横竖屏切换:

实现方法: Activity中还有一属性和屏幕方向有关:

android:screenOrientation=["unspecified" | "user" | "behind" | "landscape" | "portrait" | "sensor" | "nosensor"]
在Mainifest.xml的Activity元素中增加这么一个属性:
android:screenOrientation=”portrait”则无论手机如何变动,拥有这个属性的activity都将是竖屏显示。
android:screenOrientation=”landscape”,为横屏显示。


//--------------------------------------------------------------------------------------------

方法二:

首先在Mainifest.xml的Activity元素中加入android:configChanges=”orientation|keyboardHidden”属性:

加入这条属性的含义是,应用程序将会处理屏幕方向和键盘状态(推出或合上)信息的改动。

但对于其他的设备配置信息的改动则会由Android系统来处理(销毁当前Activity,然后重启一个新的Activity实例)

然后 在java代码的activity子类中加入配置信息改动的处理代码:

 

//-----------------------------------------------------------------------------------------
@Override public void onConfigurationChanged(Configuration newConfig)
{
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)
{
//实体键盘处于合上状态,在此处添加额外的处理代码
}
}


本文来源:http://www.bbyears.com/banzhurengongzuo/83578.html

热门标签

更多>>

本类排行