16_Android生命周期再介绍,通过androidconfigChanges属性让界面旋转时不改变状态中保留的值
A? android:configChanges屬性
對(duì)android:configChanges屬性,一般認(rèn)為有以下幾點(diǎn):
| 1 不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次。 |
| 2 設(shè)置Activity的android:configChanges="orientation"時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次。 |
| 3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法。 |
| 4 但是,自從Android 3.2(API 13),在設(shè)置Activity的android:configChanges="orientation|keyboardHidden"后,還是一樣 會(huì)重新調(diào)用各個(gè)生命周期的。因?yàn)?/span>screen size也開(kāi)始跟著設(shè)備的橫豎切換而改變。所以,在AndroidManifest.xml里設(shè)置的MiniSdkVersion和 TargetSdkVersion屬性大于等于13的情況下,如果你想阻止程序在運(yùn)行時(shí)重新加載Activity,除了設(shè)置"orientation", 你還必須設(shè)置"ScreenSize"。 |
解決辦法:
??? AndroidManifest.xml中設(shè)置android:configChanges="orientation|screenSize“
B Activity的ConfigChanges屬性
官方解釋:通過(guò)設(shè)置這個(gè)屬性可以使Activity捕捉設(shè)備狀態(tài)變化,以下是可以被識(shí)別的內(nèi)容:
| CONFIG_FONT_SCALE |
設(shè)置方法:將下列字段用”local|navigation|orientation”
| mcc:移動(dòng)國(guó)家號(hào)碼,由三位數(shù)字組成,每個(gè)國(guó)家都有自己獨(dú)立的MCC,可以識(shí)別手機(jī)用戶(hù)所屬?lài)?guó)家。 |
| mnc:移動(dòng)網(wǎng)號(hào),在一個(gè)國(guó)家或者地區(qū)中,用于區(qū)分手機(jī)用戶(hù)的服務(wù)商。 |
| locale:用戶(hù)所在地區(qū)發(fā)生變化。 |
| touchscreen:The touchscreen has changed. (This should never normally happen.) |
| keyboard:鍵盤(pán)模式發(fā)生變化,例如:用戶(hù)接入外部鍵盤(pán)輸入 |
| keyboardHidden:用戶(hù)打開(kāi)手機(jī)硬件鍵盤(pán)。 |
| navigation: The navigation type has changed. (This should never normally happen.) |
| orientation:設(shè)備旋轉(zhuǎn),橫向顯示和豎向顯示模式切換。 |
| fontScale:全局字體大小縮放發(fā)生改變。 |
C 通過(guò)設(shè)置android:configChanges查看activity的生命周期的變化,看打印情況。
?
1 編寫(xiě)如下Android應(yīng)用程序:
2 編寫(xiě)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 編寫(xiě)布局文件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 編寫(xiě)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; ? /** ?* 默認(rèn)情況下橫豎屏切換activity會(huì)銷(xiāo)毀然后重新創(chuàng)建 ?* @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("對(duì)方的生命值:" + blood); ?????????????????? if (blood < 0) { ??????????????????????????? Toast.makeText(this, "K.O.!", 1).show(); ?????????????????? } ???????? } ???????? ???????? //被銷(xiāo)毀的時(shí)候調(diào)用的方法 ???????? @Override ???????? protected void onDestroy() { ?????????????????? Log.i(TAG, "onDestroy"); ?????????????????? super.onDestroy(); ???????? } ???????? ???????? //當(dāng)activity界面用戶(hù)可見(jiàn)的時(shí)候調(diào)用的方法 ???????? @Override ???????? protected void onStart() { ?????????????????? Log.i(TAG, "onStart"); ?????????????????? super.onStart(); ???????? } ???????? ???????? protected void onRestart() { ?????????????????? Log.i(TAG, "onRestart"); ?????????????????? super.onRestart(); ???????? } ???????? ???????? //當(dāng)activity界面用戶(hù)不可見(jiàn)的時(shí)候調(diào)用的方法 ???????? protected void onStop() { ?????????????????? Log.i(TAG, "onStop"); ?????????????????? super.onStop(); ???????? } ???????? ???????? //界面開(kāi)始獲取到焦點(diǎn)對(duì)應(yīng)的方法。 (界面按鈕可以被點(diǎn)擊,文本框可以輸入內(nèi)容) ???????? protected void onResume() { ?????????????????? Log.i(TAG, "onResume"); ?????????????????? super.onResume(); ???????? } ???????? ???????? //界面失去焦點(diǎn)對(duì)應(yīng)的方法(暫停)(按鈕不可被點(diǎn)擊,文本框不可輸入內(nèi)容,但是界面用戶(hù)仍然能看見(jiàn)) ???????? protected void onPause() { ?????????????????? Log.i(TAG, "onPause"); ?????????????????? super.onPause(); ???????? } } |
Android的生命周期圖:
當(dāng)activity不加android:configChanges="orientation|keyboardHidden|screenSize"的測(cè)試結(jié)果:
(1):啟動(dòng)時(shí)輸出:
說(shuō)明:
A:onCreate:創(chuàng)建activity
B:onStart:當(dāng)activity界面用戶(hù)可見(jiàn)的時(shí)候調(diào)用的方法。
C:onResume:界面開(kāi)始獲取焦點(diǎn)對(duì)應(yīng)的方法。(界面按鈕可以被點(diǎn)擊,文本框可以輸入內(nèi)容)。
(2):按返回箭頭按鈕直到不可見(jiàn),調(diào)用的方法有:
說(shuō)明:
A:onPause界面失去焦點(diǎn)對(duì)應(yīng)的方法(暫停)(按鈕不可被點(diǎn)擊,文本框不可輸入內(nèi)容,但是界面用戶(hù)仍然能看見(jiàn))。
B:onStop:當(dāng)activity界面用戶(hù)不可見(jiàn)的時(shí)候調(diào)用的方法。
C:onDestory:被銷(xiāo)毀的時(shí)候調(diào)用的方法。
(3):按小房子的按鈕讓界面從可見(jiàn)到不可見(jiàn)的過(guò)程:
說(shuō)明:
這個(gè)過(guò)程只是讓界面失去焦點(diǎn),不可見(jiàn),沒(méi)有銷(xiāo)毀activity。
(4):在(3)的基礎(chǔ)上,再次點(diǎn)擊應(yīng)用程序打開(kāi)打開(kāi)界面過(guò)程,執(zhí)行的操作如下:
說(shuō)明:
onRestart:當(dāng)activity沒(méi)有死的時(shí)候會(huì)直接調(diào)用這個(gè)方法。
onStart:讓activity可見(jiàn)。
onResume:獲取到焦點(diǎn)。
?
?
點(diǎn)擊重拳:
開(kāi)始界面顯示:
當(dāng)手機(jī)旋轉(zhuǎn)之后的效果如下:
現(xiàn)象:值又變成最開(kāi)始的值了,也就是說(shuō)沒(méi)有保存上一個(gè)界面狀態(tài)中的值。
?
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> |
運(yùn)行程序,開(kāi)始界面如下:
手機(jī)屏幕旋轉(zhuǎn)之后的界面
這個(gè)現(xiàn)象說(shuō)明,沒(méi)有加android:configChanges="orientation|keyboardHidden|screenSize"時(shí)屏幕旋轉(zhuǎn)會(huì)改變?cè)械膮?shù)的值,如果加了,屏幕狀態(tài)中保存的值不會(huì)隨著界面旋轉(zhuǎn)而改變。
?
總結(jié)
以上是生活随笔為你收集整理的16_Android生命周期再介绍,通过androidconfigChanges属性让界面旋转时不改变状态中保留的值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基金定投单位净值越大越好吗
- 下一篇: 什么公司可以开商业承兑汇票