关于安卓屏幕横竖屏切换及其生命周期的演示:
(1)什么都不设置的一个生命周期:(生命周期会回调,走两次)
启动---> 切换横屏---> 点击返回结束
(2)只设置了如下方法:(生命周期也会回调走两次)
启动---> 切换横屏---> 点击返回结束
(3)在AndroidMainfest.xml里设置如下两个方法的一个生命周期(这个时候切换的时候会走onconfigChange()方法,不回调了,只走一次完整生命周期)
启动---> 切换横屏---> 点击返回结束
(4)相关代码:
布局xml代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="切换横竖屏"
android:onClick="changeScreen"/>
<TextView
android:id="@+id/text_screen"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
</android.support.constraint.ConstraintLayout>
Activity代码:(此处用koltin代码实现)
class MainActivity : AppCompatActivity() {
/**
* 屏幕横竖屏切换,和生命周期管理
*/
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//获取当前的时间
val format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val time = format.format(Date())
text_screen.text="onCreate"+time
//给TextView设置点击事件清除文字
text_screen.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View) {
text_screen.text = "重新来!"
}
})
Log.e("TAG", "onCreate")
}
//改变横竖屏切换的方法
fun changeScreen(view: View) {
/**
* int ORIENTATION_PORTRAIT = 1; 竖屏
* int ORIENTATION_LANDSCAPE = 2; 横屏
*/
//获取屏幕的方向 ,数值1表示竖屏,数值2表示横屏
val screenNum = resources.configuration.orientation
//(如果竖屏)设置屏幕为横屏
if (screenNum == 1) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
//设置为置屏幕为竖屏
} else {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
}
//屏幕方向发生改变的回调方法
override fun onConfigurationChanged(newConfig: Configuration) {
if (newConfig.orientation === Configuration.ORIENTATION_LANDSCAPE) {
text_screen.append("\n 当前屏幕为横屏")
} else {
text_screen.append("\n 当前屏幕为竖屏")
}
super.onConfigurationChanged(newConfig)
Log.e("TAG", "onConfigurationChanged")
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //设置横屏
}
override fun onStart() {
super.onStart()
text_screen.append("\n onStart")
Log.e("TAG", "onStart")
}
override fun onRestart() {
super.onRestart()
text_screen.append("\n onRestart")
Log.e("TAG", "onRestart")
}
override fun onResume() {
super.onResume()
text_screen.append("\n onResume")
Log.e("TAG", "onResume")
}
override fun onPause() {
super.onPause()
text_screen.append("\n onPause")
Log.e("TAG", "onPause")
}
override fun onStop() {
super.onStop()
text_screen.append("\n onStop")
Log.e("TAG", "onStop")
}
override fun onDestroy() {
super.onDestroy()
text_screen.append("\n onDestroy")
Log.e("TAG", "onDestroy")
}
//AdMainfest.xml里加这个两个和不加的区别:
//android:configChanges="orientation|keyboardHidden|screenSize"
//android:screenOrientation="portrait"
//或者只设置:
//android:configChanges="orientation"
}
AndroidMainfest.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.lenovo.myscreen">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
(5)注意:
A:configChanges属性
configChanges属性可以设置多个值,中间使用竖线分割;
1. orientation 屏幕在纵向和横向间旋转
2.keyboardHidden 键盘显示或隐藏
3.screenSize 屏幕大小改变了
4.fontScale 用户变更了首选的字体大小
5.locale 用户选择了不同的语言设定
6.keyboard 键盘类型变更,例如手机从12键盘切换到全键盘
7.touchscreen或navigation 键盘或导航方式变化,一般不会发生这样的事件
其中前面三个是常用的,后面的属性很少用!
如果要Activity中的生命周期不回调,就要设置:android:configChanges="orientation|keyboardHidden|screenSize"
注意一定要设置这三个值,否是生命周期会被回掉
B:screenOrientation属性
screenOrientation有如下选项:
1.unspecified 默认值,由系统判断状态自动切换
2.landscape 横屏
3. portrait 竖屏
4.user 用户当前设置的orientation值
5. behind 下一个要显示的Activity的orientation值
6. sensor 使用传感器 传感器的方向
7. nosensor 不使用传感器 基本等同于unspecified
screenOrientation只能选一个值!一般设置都是横屏或竖屏,其他也很少用
C:onConfigurationChanged方法
//屏幕方向发生改变的回调方法
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
text_screen.append("\n 当前屏幕为横屏");
} else {
text_screen.append("\n 当前屏幕为竖屏");
}
super.onConfigurationChanged(newConfig);
Log.e("TAG", "onConfigurationChanged");
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //设置横屏
}
前提是AndroidMainfest.xml中已经定义了:android:configChanges="orientation"