16_Android生命周期再介绍,通过androidconfigChanges属性让界面旋转时不改变状态中保留的值

??

A  android:configChanges属性

对android:configChanges属性,一般认为有以下几点:


1 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。


2 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。


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


4 但是,自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样 会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation", 你还必须设置"ScreenSize"。

解决办法:

AndroidManifest.xml中设置android:configChanges="orientation|screenSize“

B Activity的ConfigChanges属性

官方解释:通过设置这个属性可以使Activity捕捉设备状态变化,以下是可以被识别的内容:


CONFIG_FONT_SCALE
CONFIG_MCC
CONFIG_MNC
CONFIG_LOCALE
CONFIG_TOUCHSCREEN
CONFIG_KEYBOARD
CONFIG_NAVIGATION
CONFIG_ORIENTATION

设置方法:将下列字段用”local|navigation|orientation”


mcc:移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。


mnc:移动网号,在一个国家或者地区中,用于区分手机用户的服务商。


locale:用户所在地区发生变化。


touchscreen:The touchscreen has changed. (This should never normally happen.)


keyboard:键盘模式发生变化,例如:用户接入外部键盘输入


keyboardHidden:用户打开手机硬件键盘。


navigation: The navigation type has changed. (This should never normally happen.)


orientation:设备旋转,横向显示和竖向显示模式切换。


fontScale:全局字体大小缩放发生改变。

C 通过设置android:configChanges查看activity的生命周期的变化,看打印情况。

1 编写如下Android应用程序:

2 编写Android清单文件如下:


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.itheima.kof97"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="19" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name="com.itheima.kof97.MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

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

</intent-filter>

</activity>

</application>

</manifest>

2 编写布局文件activity_main.xml


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity" >

<Button

android:layout_centerHorizontal="true"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:onClick="click"

android:text="重拳"/>

<TextView

android:id="@+id/tv_blood"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal="true"

android:layout_centerVertical="true"

android:text="100"/>

</RelativeLayout>

3 编写Activity,代码如下:


package com.itheima.kof97;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.TextView;

import android.widget.Toast;

/**

* 默认情况下横竖屏切换activity会销毁然后重新创建

* @author toto

*/

public class MainActivity extends Activity {

private TextView tv_blood;

private int blood = 100;

private static String TAG = "android:Config";

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Log.i(TAG, "onCreate");

setContentView(R.layout.activity_main);

tv_blood = (TextView) findViewById(R.id.tv_blood);

}

public void click(View view) {

blood--;

tv_blood.setText("对方的生命值:" + blood);

if (blood < 0) {

Toast.makeText(this, "K.O.!", 1).show();

}

}

//被销毁的时候调用的方法

@Override

protected void onDestroy() {

Log.i(TAG, "onDestroy");

super.onDestroy();

}

//当activity界面用户可见的时候调用的方法

@Override

protected void onStart() {

Log.i(TAG, "onStart");

super.onStart();

}

protected void onRestart() {

Log.i(TAG, "onRestart");

super.onRestart();

}

//当activity界面用户不可见的时候调用的方法

protected void onStop() {

Log.i(TAG, "onStop");

super.onStop();

}

//界面开始获取到焦点对应的方法。 (界面按钮可以被点击,文本框可以输入内容)

protected void onResume() {

Log.i(TAG, "onResume");

super.onResume();

}

//界面失去焦点对应的方法(暂停)(按钮不可被点击,文本框不可输入内容,但是界面用户仍然能看见)

protected void onPause() {

Log.i(TAG, "onPause");

super.onPause();

}

}

Android的生命周期图:

当activity不加android:configChanges="orientation|keyboardHidden|screenSize"的测试结果:

(1):启动时输出:

说明:

A:onCreate:创建activity

B:onStart:当activity界面用户可见的时候调用的方法。

C:onResume:界面开始获取焦点对应的方法。(界面按钮可以被点击,文本框可以输入内容)。

(2):按返回箭头按钮直到不可见,调用的方法有:

说明:

A:onPause界面失去焦点对应的方法(暂停)(按钮不可被点击,文本框不可输入内容,但是界面用户仍然能看见)。

B:onStop:当activity界面用户不可见的时候调用的方法。

C:onDestory:被销毁的时候调用的方法。

(3):按小房子的按钮让界面从可见到不可见的过程:

说明:

这个过程只是让界面失去焦点,不可见,没有销毁activity。

(4):在(3)的基础上,再次点击应用程序打开打开界面过程,执行的操作如下:

说明:

onRestart:当activity没有死的时候会直接调用这个方法。

onStart:让activity可见。

onResume:获取到焦点。

点击重拳:

开始界面显示:

当手机旋转之后的效果如下:

现象:值又变成最开始的值了,也就是说没有保存上一个界面状态中的值。

4、修改AndroidManifest.xml文件,添加android:configChanges="orientation|keyboardHidden|screenSize"。后的效果如下:


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.itheima.kof97"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="19" />

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:configChanges="orientation|keyboardHidden|screenSize"

android:name="com.itheima.kof97.MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

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

</intent-filter>

</activity>

</application>

</manifest>

运行程序,开始界面如下:

手机屏幕旋转之后的界面

这个现象说明,没有加android:configChanges="orientation|keyboardHidden|screenSize"时屏幕旋转会改变原有的参数的值,如果加了,屏幕状态中保存的值不会随着界面旋转而改变。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-28 19:21:11

16_Android生命周期再介绍,通过androidconfigChanges属性让界面旋转时不改变状态中保留的值的相关文章

vue生命周期的介绍

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>vue生命周期</title> 6 <script src="../js/vue.js"></script> 7 <meta name="viewport" content="width=devic

php会话(session)生命周期概念介绍及设置更改和回收

http://www.169it.com/article/8429580816135935852.html https://my.oschina.net/jiec/blog/227252 如何严格限制session在30分钟后过期!1.设置客户端cookie的lifetime为30分钟:2.设置session的最大存活周期也为30分钟:3.为每个session值加入时间戳,然后在程序调用时进行判断:至于为什么,我们首先来了解下php中session的基本原理:PHP中的session有效期默认是

4、android生命周期的介绍

1.什么事Activity 就是布满整个窗口或者悬浮于其他窗口之上的交互界面,一个应用由多个Activity构成,都会在Mainifest.xml中指定一个主的Activity. 当程序第一次运行就会看到主activity,这个activity通过启动其他activity进行相关操作 当启动其他activity时,当前这个activity将会停止,新的activity压入栈中,同事获取用户焦点 因为栈是先进后出,用户back时,当前页面销毁,之前页面显示 2.Activity的生命周期 7个方法

嵌入式 Linux C语言(八)——存储类型、作用域、生命周期、链接属性

嵌入式 Linux C语言(八)--存储类型.作用域.生命周期.链接属性 一.存储类型 C语言中,每个变量和函数都有两个属性:数据类型和数据的存储类型. 变量的存储类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久.计算机中有三个地方可以用于存储变量:普通内存,运行时堆和栈,硬件寄存器.变量的存储类型取决于声明变量的位置. C语言存储类别说明符: 说明符 用    法 auto 只在代码块内变量声明中被允许, 表示变量具有本地生存期 extern 出现在顶

存储类、作用域、生命周期、链接属性

1.linux下C语言程序的内存映像代码段(.text).数据段(.data).bss段.栈.堆的概念 代码段(.text) (1)对应着程序中的代码(函数),代码段在linux中又叫文本段(.text)(2)部分平台下的const修饰的变量. 数据段(.data) 1.显式初始化为非0的全局变量: 2.显式初始化为非0的static局部变量 bss段 1.显式初始化为0或者未显式初始化的全局变量: 2.显式初始化为0或未显式初始化的static局部变量. 栈 局部变量分配在栈上:函数调用传参过

7、C_存储类 &amp;amp; 作用域 &amp;amp; 生命周期 &amp;amp; 链接属性

概念解析 存储类 存储类就是存储类型,也就是描述C语言变量在何种地方存储. 内存有多种管理方法:栈.堆.数据段.bss段..text段······一个变量的存储类属性就是描述这个变量存储在何种内存段中. 譬如:局部变量分配在栈上,所以它的存储类就是栈:显式初始化为非0的全局变量分配在数据段,显式初始化为0和没有显示初始化(默认为0)的全局变量分配在bss段. 作用域 作用域是描述这个变量起作用的代码范围. 基本来说,C语言变量的作用域规则是代码块作用域.意思就是这个变量起作用的范围是当前的代码块

react教程(一)JSX语法、组件概念、生命周期介绍

JSX React中,推出了一种新的语法取名为JSX,它给了JS中写HTML标签的能力,不需要加引号.JSX的语法看起来是一种模板,然而它在编译以后,会转成JS语法,只是书写过程中的语法糖. JSX的解析器会帮我们读取这种语法并加以处理. 下面是一个简单的例子. const element = <h1 className="greeting">Hello, world!</h1>; 其实相当于如下的代码: const element = React.create

储存类生命周期链接属性作用域总结

储存类:变量在定义时的储存类型对其在程序中的生命周期.连接属性及作用域有很大的关联链接属性: 无连接.内连接.外链接关键字:1.auto    用于修饰局部变量,在定义局部变量时,将其定义在栈上.普通局部变量存放在栈上,因为栈内存的特性决定了普通局部变量定时如果未初始化其的值是随机的,因为栈内存是脏的,变量在释放后并未对其初始化,且栈内存被广泛运用,也就造就了普通变量的特性.普通局部变量的生命周期是临时,可从其存放于栈上看出其临时的特性.普通局部变量的作用域为代码块中"{}",C89与

浅谈Android之Activity生命周期

 Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的.今天我们就来详细地聊聊Activity的生命周期,以便我们在以后的开发中能如鱼得水. 一.初识Activity   在日常应用中Activity是与用户交互的接口,它提供了一个用户完成相关操作的窗口.当我们在开发中创建Activity后,通过调用setContentView(View)方法来给该Activity指定一个布局界