设为首页 加入收藏

TOP

Android基础知识总结篇(三)
2015-07-16 12:56:23 来源: 作者: 【 】 浏览:149
Tags:Android 基础知识 总结
ENTATION_LANDSCAPE);?//横屏


为应用中的Activity设置特定的方向是经常用到的办法,可以为我们省去不少不必要的麻烦。不过,我们今天讲的是屏幕方向改变时的生命周期,所以我们并不采用固定屏幕方向这种办法。


下面我们就结合实例讲解一下屏幕转换的生命周期,我们新建一个Activity命名为OrientationActivity,如下:


package com.scott.lifecycle;


import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
import android.util.Log;


public class OrientationActivity extends Activity {
?
?private static final String TAG = "OrientationActivity";
?private int param = 1;
?
?@Override
?protected void onCreate(Bundle savedInstanceState) {
? super.onCreate(savedInstanceState);
? setContentView(R.layout.orientation_portrait);
? Log.i(TAG, "onCreate called.");
?}
?
?@Override
?protected void onStart() {
? super.onStart();
? Log.i(TAG, "onStart called.");
?}
?
?@Override
?protected void onRestart() {
? super.onRestart();
? Log.i(TAG, "onRestart called.");
?}
?
?@Override
?protected void onResume() {
? super.onResume();
? Log.i(TAG, "onResume called.");
?}
?
?@Override
?protected void onPause() {
? super.onPause();
? Log.i(TAG, "onPause called.");
?}
?
?@Override
?protected void onStop() {
? super.onStop();
? Log.i(TAG, "onStop called.");
?}
?
?@Override
?protected void onDestroy() {
? super.onDestroy();
? Log.i(TAG, "onDestory called.");
?}


?@Override
?protected void onSaveInstanceState(Bundle outState) {
? outState.putInt("param", param);
? Log.i(TAG, "onSaveInstanceState called. put param: " + param);
? super.onSaveInstanceState(outState);
?}
?
?@Override
?protected void onRestoreInstanceState(Bundle savedInstanceState) {
? param = savedInstanceState.getInt("param");
? Log.i(TAG, "onRestoreInstanceState called. get param: " + param);
? super.onRestoreInstanceState(savedInstanceState);
?}
?
?//当指定了android:configChanges="orientation"后,方向改变时onConfigurationChanged被调用
?@Override
?public void onConfigurationChanged(Configuration newConfig) {
? super.onConfigurationChanged(newConfig);
? Log.i(TAG, "onConfigurationChanged called.");
? switch (newConfig.orientation) {
? case Configuration.ORIENTATION_PORTRAIT:
? ?setContentView(R.layout.orientation_portrait);
? ?break;
? case Configuration.ORIENTATION_LANDSCAPE:
? ?setContentView(R.layout.orientation_landscape);
? ?break;
? }
?}
}


首先我们需要进入“Settings->Display”中,将“Auto-rotate Screen”一项选中,表明可以自动根据方向旋转屏幕,然后我们就可以测试流程了,当我们旋转屏幕时,我们发现系统会先将当前Activity销毁,然后重建一个新的:



系统先是调用onSaveInstanceState方法,我们保存了一个临时参数到Bundle对象里面,然后当Activity重建之后我们又成功的取出了这个参数。


为了避免这样销毁重建的过程,我们需要在AndroidMainfest.xml中对OrientationActivity对应的配置android:configChanges="orientation",然后我们再测试一下,我试着做了四次的旋转,打印如下:



可以看到,每次旋转方向时,只有onConfigurationChanged方法被调用,没有了销毁重建的过程。


以下是需要注意的几点:


1.如果配置了android:screenOrientation属性,则会使android:configChanges="orientation"失效。


2.模拟器与真机差别很大:模拟器中如果不配置android:configChanges属性或配置值为orientation,切到横屏执行一次销毁->重建,切到竖屏执行两次。真机均为一次。模拟器中如果配置android:configChanges="orientation|keyboardHidden"(如果是Android4.0,则是"orientation|keyboardHidden|screenSize"),切竖屏执行一次onConfigurationChanged,切横屏执行两次。真机均为一次。


Activity的生命周期与程序的健壮性有着密不可分的关系,希望朋友们能够认真体会、熟练应用。


首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android Service生命周期及用法 下一篇Android 中替代 sharedpreference..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: