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

防止Activity被重新创建

2016-05-25 14:51 302 查看
Activity在系统配置发生改变之后会重新创建,我们常见的是在手机旋转屏幕时activity就被重新创建了。那么怎么样才能不被创建呢?我们先来看一下系统的那些内容被改变后Activity会被重新创建。

系统的配置在Configuration类中,我们来查看Configuration类中的成员,看看他们分别代表的意思。

mcc: SIM卡唯一标示IMSI(国际移动用户识别码)中的国家代码,由三位数字组成,中国为460。此项标示mcc代码发生了改变

mnc: SIM卡的唯一标示IMSI(国际移动用户识别码)中的运营商代码,由2位数字组成,中国移动TD系统为00,中国联通为01,此项标示mnc发生改变

locale:设备的本地位置发生了改变,一般指切换了系统语言。

touchscreen:触屏发生了改变

keyboard:键盘类型发生了改变,比如使用了外接键盘

keyboardHidden:键盘的可访问性发生了改变,比如用户调出了键盘

navigation:系统导航发生了改变,比如采用了轨迹导航,这个有点费解,很难发生,可以忽略它。

srceenLayout:屏幕布局发生了改变,很可能是激活了另外一个显示设备

frontScale:系统字体缩放比例发生了变化,比如用户选择了一个新字号

uiMode:用户界面模式发生了改变,比如是否开启了夜间模式(API8新加)

orientation:屏幕方向发生了改变,这个是最常用的,比如旋转了手机屏幕

sreenSize:当屏幕尺寸信息发生改变,当选装设备时,屏幕尺寸会发生改变,这个选项比较特殊,它和编译选项有关,当编译选项中的minSdkVersion 和 targetSdkVersion均低于13时,此选项不会到时Activity重启,负责Activity将重启(api13)添加

smallScreenSize:设备的物理尺寸发生改变,这个项目和屏幕的方向没关系,仅仅表示在实习的物理屏幕的尺寸发生改变的时候,比如用户切换到了外部的显示设备,这个选项和srceenSize一样,当编译选项中中的minSdkVersion和targetSdkVersion均低于13时,此选项不会导致Activity重启,负责将导致Activity重启(API13新添加)

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息