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