防止Activity被重新创建

Activity在系统配置发生改变之后会重新创建,我们常见的是在手机旋转屏幕时activity就被重新创建了。那么怎么样才能不被创建呢?我们先来看一下系统的那些内容被改变后Activity会被重新创建。
系统的配置在Configuration类中,我们来查看Configuration类中的成员,看看他们分别代表的意思。

  1. mcc: SIM卡唯一标示IMSI(国际移动用户识别码)中的国家代码,由三位数字组成,中国为460。此项标示mcc代码发生了改变
  2. mnc: SIM卡的唯一标示IMSI(国际移动用户识别码)中的运营商代码,由2位数字组成,中国移动TD系统为00,中国联通为01,此项标示mnc发生改变
  3. locale:设备的本地位置发生了改变,一般指切换了系统语言。
  4. touchscreen:触屏发生了改变
  5. keyboard:键盘类型发生了改变,比如使用了外接键盘
  6. keyboardHidden:键盘的可访问性发生了改变,比如用户调出了键盘
  7. navigation:系统导航发生了改变,比如采用了轨迹导航,这个有点费解,很难发生,可以忽略它。
  8. srceenLayout:屏幕布局发生了改变,很可能是激活了另外一个显示设备
  9. frontScale:系统字体缩放比例发生了变化,比如用户选择了一个新字号
  10. uiMode:用户界面模式发生了改变,比如是否开启了夜间模式(API8新加)
  11. orientation:屏幕方向发生了改变,这个是最常用的,比如旋转了手机屏幕
  12. sreenSize:当屏幕尺寸信息发生改变,当选装设备时,屏幕尺寸会发生改变,这个选项比较特殊,它和编译选项有关,当编译选项中的minSdkVersion 和 targetSdkVersion均低于13时,此选项不会到时Activity重启,负责Activity将重启(api13)添加
  13. smallScreenSize:设备的物理尺寸发生改变,这个项目和屏幕的方向没关系,仅仅表示在实习的物理屏幕的尺寸发生改变的时候,比如用户切换到了外部的显示设备,这个选项和srceenSize一样,当编译选项中中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重启,负责将导致Activity重启(API13新添加)
  14. layoutDirection:当布局发生变化,这个属性用的比较少,正常情况下无须修改布局的layoutDirection属性(API17新添加)

    上面列出的项目很多,其实我们常用的就 locale、orientation 和 keyboardHidden这三项。

那么我们来看一下怎么让这些配置改变之后,Activity不重建呢?其实很简单。
比如我们不想让 屏幕方向发生改变时Activity重建,那么只需在AndroidManfest.xml中对应的Activity标签中添加一句 android:configChanges=”orientation”

    <activity android:name=".MainActivity"
            android:configChanges="orientation"  //添加这句
            >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

那么当屏幕发生改变时,Activity不会被重建。但会回调Activity中的onConfigurationChanged方法。我在实际应用中发现:只添android:configChanges=”orientation” 不能阻止Activity重建,原因在于:在屏幕旋转是srceenSize 也发生了改变。所有最后决定这样写:android:configChanges=”orientation|screenSize”
那么我们来看一下我的代码,以及运行结果
MainActivity.java

package com.simple.myapplication;

import android.content.Intent;
import android.content.res.Configuration;
import android.os.PersistableBundle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,SecondActivity.class));

            }
        });

        Log.i(TAG, "onCreate: ");
    }

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);

    }

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

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

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

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

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

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

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putInt("key",1);
        super.onSaveInstanceState(outState);
        Log.i(TAG, "onSaveInstanceState: ");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        int i  = savedInstanceState.getInt("key");
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG, "onRestoreInstanceState:");
    }


     /**
     * AndroidManifest如果添加 configChanges ="..." 使得Acivity不重建
     * 则会调用这个方法
     * @param newConfig
     */
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.i(TAG, "onConfigurationChanged: "+newConfig.orientation);
    }
}



AndroidManifest.xml

 <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>
运行结果:
com.simple.myapplication I/MainActivity: onConfigurationChanged: 2
com.simple.myapplication I/MainActivity: onConfigurationChanged: 1
com.simple.myapplication I/MainActivity: onConfigurationChanged: 2

注意我这里的指定的minSdkVersion和tagetSdkVersion大于13,所以为了防止屏幕旋转时Activity重启,除了orientation,我们还要添加srceenSize。

你可能感兴趣的:(Android,Andorid应用开发)