</pre> 最近在做公司项目时,发现横竖屏切换和我原来的认知不太一样,原来我是知道同一个Activity横竖屏切换时,会导致生命周期重启。那么今天就趁此机会将android中横竖屏相关的知识总结一下。<p></p><p></p><p><strong><span style="white-space:pre"></span>首先,我们看同一个activity横竖屏,会执行那么生命周期中的方法:</strong></p><p><span style="white-space:pre"></span>代码如下:</p><p><span style="white-space:pre"></span></p><pre name="code" class="java">package com.example.demo;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
private static final String tag = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(tag, "onCreate");
}
@Override
protected void onStart() {
Log.d(tag, "onStart");
super.onStart();
}
@Override
protected void onResume() {
Log.d(tag, "onResume");
super.onResume();
}
@Override
protected void onPause() {
Log.d(tag, "onPause");
super.onPause();
}
@Override
protected void onStop() {
Log.d(tag, "onStop");
super.onStop();
}
@Override
protected void onDestroy() {
Log.d(tag, "onDestroy");
super.onDestroy();
}
}
1. 先看竖屏时,启动以后会执行那些生命周期:
01-23 22:34:30.659: D/MainActivity(12738): onCreate
01-23 22:34:30.659: D/MainActivity(12738): onStart
01-23 22:34:30.659: D/MainActivity(12738): onResume
2. 我们将手机横屏以后,看看会执行那些周期回调方法:
01-23 22:39:43.809: D/MainActivity(12738): onPause
01-23 22:39:43.809: D/MainActivity(12738): onStop
01-23 22:39:43.809: D/MainActivity(12738): onDestroy
01-23 22:39:43.869: D/MainActivity(12738): onCreate
01-23 22:39:43.869: D/MainActivity(12738): onStart
01-23 22:39:43.869: D/MainActivity(12738): onResume
可以明显看出,横屏以后,又将执行oncreate/onstart/onresume这些方法,也就是生命周期重启了。如果不太了解这个知识点的话,再写代码时很容易掉坑里边。接下来我们就要想想如何防止生命周期重启。
<activity
android:name="com.example.demo.MainActivity"
android:configChanges="orientation|keyboard|screenSize"
>
<intent-filter >
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
需要配置android:configChanges="orientation|keyboard|screenSize"的信息。配置完成以后,横竖屏以后就不会再重启了。这是其中的一个方法。另外的方法,就算重启了,我们可以保存一些数据。重启以后又重新拿到这些数据,就算重启了,也不会有什么影响。
@Override
protected void onSaveInstanceState(Bundle outState) {
// 当activity回收、横竖屏切换时,用于保存数据。
outState.putString("name", "boss");
super.onSaveInstanceState(outState);
}
在activity中重写该方法,用于保存数据。然后在oncreate中获取数据。
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(tag, "onCreate");
if (savedInstanceState != null){
String name = savedInstanceState.getString("name");
if (name == null){
Log.d(tag, "null");
}else{
Log.d(tag, name);
}
}
}
以上就总结了同一个activity时,如何保存数据的问题。
接下来,我们看看两个不同的activity时,生命周期也会重启的。我们来看看测试结果。
另一个activity配置成横屏。结果发现竖屏的activity启动横屏的activity以后,自己的生命周期又重启。如何避免重启,或者如何保存数据,上面已经介绍。记录了这么多也算留个记号吧。
public void click(View view){
Intent intent = new Intent(this, Main1Activity.class);
startActivity(intent);
}
01-23 23:17:34.239: D/MainActivity(26184): onPause
01-23 23:17:34.239: D/MainActivity(26184): onStop
01-23 23:17:34.239: D/MainActivity(26184): onDestroy
01-23 23:17:34.299: D/MainActivity(26184): onCreate
01-23 23:17:34.299: D/MainActivity(26184): onStart
01-23 23:17:34.299: D/MainActivity(26184): onResume