本文主要是验证红米5Note Android9.0版本横竖屏切换问题
1 背景
- 第一个问题
网上查询资料说Andorid 3.2以前的SDK可以使用如下配置防止横竖屏切换重新创建Activity
android:configChanges="orientation|keyboardHidden"
Adnroid 3.2以后的SDK必须添加一个screenSize属性才能防止横竖屏切换重新创建Activity
android:configChanges="orientation|keyboardHidden|screenSize"
- 第二个问题
网上说onSaveInstanceState在onStop之前调用
2 示例验证
- 使用机型:红米5Note
- Android版本:9
2.1 示例代码
- MainActivity
package com.example.linechartdemo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected void onStart() {
super.onStart();
Log.d("TAG", "onStart");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("TAG", "onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.d("TAG", "onResume");
}
@Override
protected void onPause() {
super.onPause();
Log.d("TAG", "onPause");
}
@Override
protected void onStop() {
super.onStop();
Log.d("TAG", "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("TAG", "onDestroy");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("TAG", "onCreate");
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d("TAG", "onSaveInstanceState");
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
Log.d("TAG", "onRestoreInstanceState");
}
}
- AndroidManifest
<activity android:name=".MainActivity"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2.2 不使用configChanges
-
竖屏切换横屏
图2.1 不使用configchanges竖屏切换横屏 -
横屏切换竖屏
图2.2 不使用configchanges横屏切换成竖屏由上图可以看出,不使用configChanges,则不管是竖屏切换横屏,还是横屏切换竖屏,都会销毁当前Activity重新创建Activity。由图中可以看出,onSaveInstanceState是在onStop后被调用,onRestoreInstanceState是在onStart后被调用。
2.3 使用configChanges="orientation|keyboardHidden"
<activity android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
-
竖屏切换横屏
竖屏切换横屏 -
横屏切换竖屏
横屏切换竖屏
由上图所示,只是配置configChanges="orientation|keyboardHidden"时,横竖屏切换时都会重新销毁当前Activity并重新创建Activity,onSaveInstanceState在onStop之后被调用,onRestoreInstanceState在onStart之后被调用。
注:其实还做过只使用configChanges="orientation"和configChanges="keyboardHidden"以及configChanges="keyboardHidden|orientation"的情况,最后打印出来的截图都与上图一致。
2.4 使用configChanges="orientation|keyboardHidden|screenSize"
<activity android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
横竖屏切换,最后没有任何信息打印出来,所以,当前Activity不会被销毁,而是横竖屏切换时会重用当前的Activity。将上述的configChanges改成configChanges="orientation|screenSize"后进行横竖屏切换,也没有任何信息打印。
本文验证的问题:
- android9.0 版本可通过使用configChanges="orientation|screenSize"或者configChanges="orientation|keyboardHidden|screenSize"来防止横竖屏切换时销毁并重新创建Activity
- onSaveInstanceState()是在onStop()之后被调用,onRestoreInstanceState()是在onStart之后onResume之前被调用。
网友评论