android實(shí)現(xiàn)在橫豎屏切換時(shí)頁(yè)面信息不被重置的示例分享
當(dāng)屏幕轉(zhuǎn)動(dòng)切換的時(shí)候 Android 機(jī)制是:
銷毀當(dāng)前屏幕的 Activity ,然后重新開(kāi)啟一個(gè)新的適應(yīng)屏幕改變的 Activity 。
那么,我們?cè)撊绾卧谄聊磺袚Q的時(shí)候頁(yè)面信息不被重置呢?
解決實(shí)現(xiàn):
1.在 AnroidMainifest.xml 的 activity 元素中加入:
android:configChanges="orientation|keyboardHidden"
或
android:configChanges="orientation|keyboard|keyboardHidden"
表示在改變屏幕方向、彈出軟件盤和隱藏軟鍵盤時(shí),不再去執(zhí)行 onCreate() 方法,
而是直接執(zhí)行 onConfigurationChanged() 。
如果不申明此段代碼,按照Activity的生命周期,都會(huì)去執(zhí)行一次 onCreate() 方法,
而 onCreate() 方法通常會(huì)在顯示之前做一些初始化工作。
所以如果改變屏幕方向這樣的操作都去執(zhí)行 onCreate() 方法,就有可能造成重復(fù)的初始化,
降低程序效率是必然的了,而且更有可能因?yàn)橹貜?fù)的初始化而導(dǎo)致數(shù)據(jù)的丟失。
這是需要避免的!
2.權(quán)限聲明:
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"></uses-permission>
API 中說(shuō)該權(quán)限允許我們改變配置信息,但是我們?cè)诟淖兤聊环较虻某绦蛑袇s并沒(méi)有用到該權(quán)限,是不是相互沖突了呢?
這里我們可以這樣認(rèn)為,當(dāng)我們聲明該權(quán)限的的時(shí)候,
系統(tǒng)允許我們通過(guò)重寫 activity 中的 onConfigurationChanged 方法來(lái)捕獲和修改某些配置信息。
3.在 Java 源代碼文件中重寫 Activity 中的 onConfigurationChanged 方法:
import android.content.res.Configuration;
// 框架回調(diào)函數(shù) onConfigurationChanged 出自 android.content.res.Configuration 包。
// 參數(shù) newConfig - 新設(shè)備的配備。
// 當(dāng)設(shè)備配置信息有改動(dòng)(比如屏幕方向的改變,實(shí)體鍵盤的推開(kāi)或合上等)時(shí),
// 并且如果此時(shí)有 Activity 正在運(yùn)行,系統(tǒng)會(huì)調(diào)用這個(gè)函數(shù)。
// 注意:onConfigurationChanged 只會(huì)響應(yīng)應(yīng)用程序在 AnroidMainifest.xml 中
// 通過(guò) android:configChanges="配置類型" 指定的配置類型的改動(dòng);
// 而對(duì)于其他配置的更改,則系統(tǒng)會(huì)先銷毀當(dāng)前屏幕的 Activity ,
// 然后重新開(kāi)啟一個(gè)新的適應(yīng)屏幕改變的 Activity 實(shí)例。
public void
onConfigurationChanged( Configuration newConfig )
{
// 一定要先調(diào)用父類的同名函數(shù),讓框架默認(rèn)函數(shù)先處理
// 下面這句一定不能省去,否則將引發(fā):android.app.SuperNotCalledException 異常。
super.onConfigurationChanged( newConfig );
// 檢測(cè)屏幕的方向:縱向或橫向
if ( this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE )
{
// 當(dāng)前為橫屏, 在此處添加額外的處理代碼
}
else if ( this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
{
//當(dāng)前為豎屏, 在此處添加額外的處理代碼
}
//檢測(cè)實(shí)體鍵盤的狀態(tài):推出或者合上
if ( newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_NO )
{
// 實(shí)體鍵盤處于推出狀態(tài),在此處添加額外的處理代碼
}
else if ( newConfig.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES )
{
// 實(shí)體鍵盤處于合上狀態(tài),在此處添加額外的處理代碼
}
}
一、新建一個(gè) Activity ,并把各個(gè)生命周期打印出來(lái):
第一步:
運(yùn)行 Activity ,得到如下信息:
onCreate
onStart
onResume
第二步:
按 crtl + f12 切換成橫屏?xí)r:
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
第三步:
再按 crtl + f12 切換成豎屏?xí)r,發(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 切換成橫屏?xí)r:(與上面無(wú)修改時(shí)相同)
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
第五步:
再按 crtl + f12 切換成豎屏?xí)r,
發(fā)現(xiàn)不會(huì)再打印相同信息,
但多打印了一行 onConfigChanged :
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onConfigurationChanged
第六步:
修改 AndroidManifest.xml 文件中的 Activity 元素,
把
android:configChanges="orientation"
改成
android:configChanges="orientation|keyboardHidden"
按 crtl + f12 切換成橫屏?xí)r,
就只打印 onConfigChanged :
onConfigurationChanged
第七步:
按 crtl + f12 切換成豎屏?xí)r:
onConfigurationChanged
onConfigurationChanged
二、總結(jié):
1.不設(shè)置 AndroidManifest.xml 文件中的 Activity 元素的 android:configChanges 時(shí),
切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次;
2.設(shè)置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges="orientation"時(shí),
切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次;
3.設(shè)置了 AndroidManifest.xml 文件中的 Activity 元素的
android:configChanges="orientation|keyboardHidden"時(shí),
切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行 onConfigurationChanged 方法!
三、補(bǔ)充一點(diǎn):
1.當(dāng)前 Activity 產(chǎn)生事件彈出 Toast 和 AlertDialog 的時(shí)候 Activity 的生命周期不會(huì)有改變!
2.Activity 運(yùn)行時(shí)按下 home 鍵(跟被完全覆蓋是一樣的):
onSaveInstanceState --> onPause --> onStop
onRestart --> onStart --> onResume
3.Activity 未被完全覆蓋只是失去焦點(diǎn):
onPause --> onResume
- android橫豎屏切換不重啟activity解決方案
- android橫豎屏切換時(shí)候Activity的生命周期
- Android Activity 橫豎屏切換的生命周期
- 解析Android橫豎屏切換的問(wèn)題
- Android橫豎屏幕切換小結(jié)
- Android編程實(shí)現(xiàn)橫豎屏切換時(shí)不銷毀當(dāng)前activity和鎖定屏幕的方法
- android中Activity橫豎屏切換的那些事
- 解決Android橫豎屏切換數(shù)據(jù)丟失問(wèn)題的方法
- Android實(shí)現(xiàn)橫豎屏切換的實(shí)例代碼
- Android橫豎屏切換及其對(duì)應(yīng)布局加載問(wèn)題詳解
相關(guān)文章
Android啟動(dòng)頁(yè)優(yōu)化之實(shí)現(xiàn)應(yīng)用秒開(kāi)
現(xiàn)在很多應(yīng)用都會(huì)在進(jìn)入主界面之前,添加一個(gè)啟動(dòng)頁(yè),然后加入幾秒鐘的廣告,我覺(jué)得這個(gè)不能算是 “真正意義上的 “ 啟動(dòng)頁(yè),應(yīng)該叫廣告頁(yè)。2021-05-05Android靜態(tài)變量的生命周期 簡(jiǎn)單介紹
Android靜態(tài)變量的生命周期 簡(jiǎn)單介紹,需要的朋友可以參考一下2013-06-06Android7.0以上Uri轉(zhuǎn)路徑的方法實(shí)現(xiàn)(已驗(yàn)證)
這篇文章主要介紹了Android7.0以上Uri轉(zhuǎn)路徑的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03關(guān)于Android Activity之間傳遞數(shù)據(jù)的6種方式
這篇文章主要介紹了關(guān)于Android Activity之間傳遞數(shù)據(jù)的6種方式,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03Android實(shí)現(xiàn)錄音功能實(shí)現(xiàn)實(shí)例(MediaRecorder)
本篇文章主要介紹了Android實(shí)現(xiàn)錄音的實(shí)例代碼(MediaRecorder),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07Android實(shí)現(xiàn)ViewPager無(wú)限循環(huán)效果(二)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)ViewPager無(wú)限循環(huán)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05Android開(kāi)發(fā)實(shí)現(xiàn)popupWindow彈出窗口自定義布局與位置控制方法
這篇文章主要介紹了Android開(kāi)發(fā)實(shí)現(xiàn)popupWindow彈出窗口自定義布局與位置控制方法,涉及Android彈出窗口功能、布局及屬性設(shè)置相關(guān)操作技巧,需要的朋友可以參考下2017-09-09SurfaceView開(kāi)發(fā)[捉小豬]手機(jī)游戲 (一)
這篇文章主要介紹了用SurfaceView開(kāi)發(fā)[捉小豬]手機(jī)游戲 (一)本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08