国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

android實現(xiàn)在橫豎屏切換時頁面信息不被重置的示例分享

2020-04-11 11:53:59
字體:
來源:轉載
供稿:網(wǎng)友

當屏幕轉動切換的時候 Android 機制是:
銷毀當前屏幕的 Activity ,然后重新開啟一個新的適應屏幕改變的 Activity 。
那么,我們該如何在屏幕切換的時候頁面信息不被重置呢?

解決實現(xiàn):
1.在 AnroidMainifest.xml 的 activity 元素中加入:

復制代碼 代碼如下:

android:configChanges="orientation|keyboardHidden"


復制代碼 代碼如下:

android:configChanges="orientation|keyboard|keyboardHidden"

表示在改變屏幕方向、彈出軟件盤和隱藏軟鍵盤時,不再去執(zhí)行 onCreate() 方法,
而是直接執(zhí)行 onConfigurationChanged() 。
如果不申明此段代碼,按照Activity的生命周期,都會去執(zhí)行一次 onCreate() 方法,
而 onCreate() 方法通常會在顯示之前做一些初始化工作。

所以如果改變屏幕方向這樣的操作都去執(zhí)行 onCreate() 方法,就有可能造成重復的初始化,
降低程序效率是必然的了,而且更有可能因為重復的初始化而導致數(shù)據(jù)的丟失。
這是需要避免的!

2.權限聲明:

復制代碼 代碼如下:

<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>

API 中說該權限允許我們改變配置信息,但是我們在改變屏幕方向的程序中卻并沒有用到該權限,是不是相互沖突了呢?
這里我們可以這樣認為,當我們聲明該權限的的時候,
系統(tǒng)允許我們通過重寫 activity 中的 onConfigurationChanged 方法來捕獲和修改某些配置信息。

3.在 Java 源代碼文件中重寫 Activity 中的 onConfigurationChanged 方法:

復制代碼 代碼如下:

import android.content.res.Configuration;

// 框架回調函數(shù) onConfigurationChanged 出自 android.content.res.Configuration 包。
// 參數(shù) newConfig - 新設備的配備。
// 當設備配置信息有改動(比如屏幕方向的改變,實體鍵盤的推開或合上等)時,
// 并且如果此時有 Activity 正在運行,系統(tǒng)會調用這個函數(shù)。
// 注意:onConfigurationChanged 只會響應應用程序在 AnroidMainifest.xml 中
//    通過 android:configChanges="配置類型" 指定的配置類型的改動;
//    而對于其他配置的更改,則系統(tǒng)會先銷毀當前屏幕的 Activity ,
//    然后重新開啟一個新的適應屏幕改變的 Activity 實例。
public void
onConfigurationChanged( Configuration newConfig )
{
    // 一定要先調用父類的同名函數(shù),讓框架默認函數(shù)先處理
    // 下面這句一定不能省去,否則將引發(fā):android.app.SuperNotCalledException 異常。
    super.onConfigurationChanged( newConfig );

    // 檢測屏幕的方向:縱向或橫向
    if ( this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE )
    {
        // 當前為橫屏, 在此處添加額外的處理代碼
    }
    else if ( this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
    {
        //當前為豎屏, 在此處添加額外的處理代碼
    }

    //檢測實體鍵盤的狀態(tài):推出或者合上   
    if ( newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO )
    {
        // 實體鍵盤處于推出狀態(tài),在此處添加額外的處理代碼
    }
    else if ( newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES )
    {
        // 實體鍵盤處于合上狀態(tài),在此處添加額外的處理代碼
    }
}

一、新建一個 Activity ,并把各個生命周期打印出來:
第一步:
運行 Activity ,得到如下信息:

復制代碼 代碼如下:

onCreate
onStart
onResume

第二步:
按 crtl + f12 切換成橫屏時:

復制代碼 代碼如下:

onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume

第三步:
再按 crtl + f12 切換成豎屏時,發(fā)現(xiàn)打印了兩次相同的信息:

復制代碼 代碼如下:

onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume

第四步:
修改 AndroidManifest.xml 文件中的 Activity 元素,
添加 android:configChanges="orientation" ,
按 crtl + f12 切換成橫屏時:(與上面無修改時相同)

復制代碼 代碼如下:

onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume

第五步:
再按 crtl + f12 切換成豎屏時,
發(fā)現(xiàn)不會再打印相同信息,
但多打印了一行 onConfigChanged :

復制代碼 代碼如下:

onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onConfigurationChanged

第六步:
修改 AndroidManifest.xml 文件中的 Activity 元素,

復制代碼 代碼如下:

android:configChanges="orientation"

改成
復制代碼 代碼如下:

android:configChanges="orientation|keyboardHidden"

按 crtl + f12 切換成橫屏時,
就只打印 onConfigChanged :

復制代碼 代碼如下:

onConfigurationChanged

第七步:
按 crtl + f12 切換成豎屏時:

復制代碼 代碼如下:

onConfigurationChanged
onConfigurationChanged

二、總結:
1.不設置 AndroidManifest.xml 文件中的 Activity 元素的 android:configChanges 時,
切屏會重新調用各個生命周期,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次;

2.設置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges="orientation"時,
切屏還是會重新調用各個生命周期,切橫、豎屏時只會執(zhí)行一次;

3.設置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges="orientation|keyboardHidden"時,
切屏不會重新調用各個生命周期,只會執(zhí)行 onConfigurationChanged 方法!

三、補充一點:
1.當前 Activity 產生事件彈出 Toast 和 AlertDialog 的時候 Activity 的生命周期不會有改變!

2.Activity 運行時按下 home 鍵(跟被完全覆蓋是一樣的):

復制代碼 代碼如下:

onSaveInstanceState --> onPause --> onStop
onRestart --> onStart --> onResume

3.Activity 未被完全覆蓋只是失去焦點:

復制代碼 代碼如下:

onPause --> onResume

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 电白县| 河北省| 长宁县| 武汉市| 凤山县| 无为县| 万州区| 翁牛特旗| 东平县| 九江县| 五原县| 阆中市| 克山县| 确山县| 庆元县| 惠东县| 崇义县| 栖霞市| 潜山县| 环江| 温州市| 广宁县| 来宾市| 溧水县| 广灵县| 凤阳县| 北宁市| 股票| 壤塘县| 皮山县| 河间市| 玛沁县| 区。| 沙河市| 尼木县| 宁乡县| 七台河市| 鄂托克前旗| 和平县| 来凤县| 炉霍县|