您的位置:首页 > 移动开发 > Android开发

Android Activity的横竖屏切换与状态保存

2017-08-02 16:33 302 查看
记得之前参加了一场面试,其中一个问题;横竖屏切换的生命周期变化?

无奈平时开发没有接触到横竖屏切换,所以当时还真不清楚。

到底如何变化,还是自己手动写代码测试来的更舒服。

关于Activity周期不清楚的可以参见:

http://blog.csdn.net/demonliuhui/article/details/65631920

横竖屏切换的代码

代码很简单,重写Activity几个生命周期的方法即可。

public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
Log.i(TAG, "onCreate------------");
setContentView(R.layout.activity_main);
}

@Override
protected void onRestart() {
super.onRestart();
Log.i(TAG, "onRestart: --------------");
}

@Override
protected void onResume() {
super.onResume();
Log.i(TAG, "onResume: -----------------");
}

@Override
protected void onPause() {
super.onPause();
Log.i(TAG, "onPause: -----------------");
}

@Override
protected void onStop() {
super.onStop();
Log.i(TAG, "onStop: -------------------");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.i(TAG, "onDestroy: -----------------");
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.i(TAG, "onConfigurationChanged: ");
}
}


启动后连续旋转屏幕



设置android:configChanges=”orientation|screenSize”,连续旋转屏幕

关于onConfigurationChanged以及onConfigurationChanged 未被调用的问题

<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>

<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>




分析

根据上图的结果可知:

横竖屏切换的过程中生命周期的变化为:

onPause()----->onStop()------>onDestroy()-------->onCreate(Bundle savedInstanceState)------>onResume()


1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期.

3、设置Activity的android:configChanges=”orientation|screenSize”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。

状态保存

添加如下代码,onSaveInstanceState(Bundle outState)在活动回收前一定会调用。

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.i(TAG, "onSaveInstanceState: ----------------");
String s = "hello world!";
outState.putString("text", s);
}


获取保存的状态

看到onSaveInstanceState(Bundle outState)的函数名及参数类型,你一定会感到特别熟悉,没错,onSaveInstanceState(Bundle outState)中的outState参数,就是onCreate(Bundle savedInstanceState)中的savedInstanceState。

我们在在onCreate(Bundle savedInstanceState)中添加如下代码:

if (savedInstanceState != null) {
String s = savedInstanceState.getString("text");
System.out.println(s);
}


运行



根据上图可知,在进行横竖屏切换的过程中,也会调用onSaveInstanceState(Bundle outState)保存状态。然后在onCreate(Bundle savedInstanceState)中便可恢复状态。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: