防止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不会被重建。但会回调Activity中的onConfigurationChanged方法。我在实际应用中发现:只添android:configChanges=”orientation” 不能阻止Activity重建,原因在于:在屏幕旋转是srceenSize 也发生了改变。所有最后决定这样写:android:configChanges=”orientation|screenSize”
那么我们来看一下我的代码,以及运行结果
MainActivity.java
AndroidManifest.xml
注意我这里的指定的minSdkVersion和tagetSdkVersion大于13,所以为了防止屏幕旋转时Activity重启,除了orientation,我们还要添加srceenSize。
系统的配置在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。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories