Android屏幕橫豎屏切換和生命周期管理的詳細總結*


    一般的我們去切換屏幕方向都是不希望Activity被重新創建,這時就需要對一些屬性進行設置,或者使用代碼設置。 
       今天想學一下Android屏幕橫豎屏切換,但是網上很多知識不准確或不正確,這里我還是自己總結一篇文章,供大家參考。

一.屏幕橫豎屏切換的代碼

       很多文章一上來就將什么生命周期或者亂七八糟的,我認為你首先要會橫豎屏切換啊!

(一)設置屏幕橫屏代碼

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

這個在Activity下可以直接使用

(二)設置屏幕豎屏的代碼

 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

(三)判斷屏幕是橫屏還是豎屏的狀態

  /** *系統中定義: int ORIENTATION_PORTRAIT = 1; 豎屏 *系統中定義: int ORIENTATION_LANDSCAPE = 2; 橫屏 */ //獲取屏幕的方向 ,數值1表示豎屏,數值2表示橫屏 int screenNum = getResources().getConfiguration().orientation;

這里啰嗦一句: 
       PORTRAIT 翻譯是肖像的意思,肖像一般都是豎直方向的吧 
       LANDSCAPE 翻譯是景觀的意思,景象一般是要橫着看的吧,才能看得比較多 
這是我對系統定義橫豎屏字面的理解。

二.橫豎屏切換Activity生命周期回調

我今天測試了一下,發現很多文章描述這里並不正確! 
橫豎屏屬性設置可以在AndroidManifest.xml中設置 
代碼:

 <activity android:name="MyActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="portrait" android:label="@string/app_name">

(一)configChanges屬性

設置configChanges這個值就可以避免Activity生命周期被回調,下面是這個值的詳細說明:

configChanges屬性可以設置多個值,中間使用豎線分割; 
1. orientation 屏幕在縱向和橫向間旋轉 
2.keyboardHidden 鍵盤顯示或隱藏 
3.screenSize 屏幕大小改變了 
4.fontScale 用戶變更了首選的字體大小 
5.locale 用戶選擇了不同的語言設定 
6.keyboard 鍵盤類型變更,例如手機從12鍵盤切換到全鍵盤 
7.touchscreen或navigation 鍵盤或導航方式變化,一般不會發生這樣的事件

其中前面三個是常用的,后面的屬性很少用! 
如果要Activity中的生命周期不回調,就要設置:

android:configChanges="orientation|keyboardHidden|screenSize"

       注意一定要設置這三個值,否是生命周期會被回掉。 
這里我吐槽一下網上的文章,很多都是說設置了“orientation“和”keyboardHidden”屬性就可以避免Activity生命周期的回調,其實不對。因為這是android很久以前版本的SDK才有效,我也是通過實驗和看別人一些經驗才知道的,很多文章沒有提到這個“ScreenSize”屬性,這也是近幾年才出現的,但是也是要必須設置的,你不試過的話就不知道! 
       如果只設置”orientation|screenSize”,會發生豎屏變橫屏生命周期會有先銷毀后重新onCreate,如果是橫屏變豎屏生命周期方法不會被回調!

(二)onConfigurationChanged方法

在Activity中可以重寫這個方法:

 //屏幕方向發生改變的回調方法 @Override public void onConfigurationChanged(Configuration newConfig) { if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { text_screen.append("\n 當前屏幕為橫屏"); } else { text_screen.append("\n 當前屏幕為豎屏"); } super.onConfigurationChanged(newConfig); Log.e("TAG", "onConfigurationChanged"); // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //設置橫屏 }

前提是AndroidMainfest.xml中已經定義了:

之后onConfigurationChanged才能得到回調。

       onConfigurationChanged方法是在xml文件中定義了屬性后,並且視圖顯示后屏幕的方向發生改變,這個方法才會被回調。 
       在onConfigurationChanged可以拿到屏幕改變后的屏幕方向的值,確認屏幕的方向。很多操作也是可以在這個回調方法中執行。

(三)screenOrientation屬性

       這個屬性相對來說就沒那么多人使用了,但是也是有用的,它可以設置屏幕默認的方向,但是僅僅是默認顯示,設置后還是可以在代碼中改變屏幕的方向的!

screenOrientation有如下選項: 
1.unspecified 默認值,由系統判斷狀態自動切換 
2.landscape 橫屏 
3. portrait 豎屏 
4.user 用戶當前設置的orientation值 
5. behind 下一個要顯示的Activity的orientation值 
6. sensor 使用傳感器 傳感器的方向 
7. nosensor 不使用傳感器 基本等同於unspecified

       screenOrientation只能選擇一個值!一般設置都是橫屏或豎屏,其他也是很少使用的。 
       上面也說了這里只是設置的一個默認值,屏幕的方向是可以通過代碼被改變。 
       如果你想一直保持橫屏或豎屏,可以在onConfigurationChanged方法后設置屏幕的方向。

(三)生命周期的知識

       系統不同會導致切屏出現不同的反應,查看網上資料發現,好像手機品牌不同也會出現不同的反應。

橫豎屏切換

1 切換到橫屏,然后切換到豎屏,銷毀了兩次
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume


2 修改AndroidManifest.xml,把該Activity添加 android:configChanges="orientation",切橫屏,再切回豎屏,發現不會再打印相同信息,只銷毀一次,但多打印了一行onConfigChanged

onSaveInstanceState
onPause
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
onConfigurationChanged

3 更改android:configChanges="orientation|keyboardHidden",切橫屏,再切回豎屏,就只打印onConfigChanged
onConfigurationChanged
onConfigurationChanged

 

(四)Activity的生命周期

當復習一下: 
onCreate、onStart、onResume、onPause、onStop、onDestory、onRestart,一共七個生命周期的方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM