亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android開發 旋轉屏幕導致Activity重建解決方法

2020-04-11 12:42:45
字體:
來源:轉載
供稿:網友
Android開發文檔上專門有一小節解釋這個問題。簡單來說,Activity是負責與用戶交互的最主要機制,任何“設置”(Configuration)的改變都可能對Activity的界面造成影響,這時系統會銷毀并重建Activity以便反映新的Configuration。
“屏幕方向”(orientation)是一個Configuration,通過查看Configuration類的javadoc可以看到其他Configuration還有哪些:如fontScale、keyboardHidden和locale等等。
當屏幕旋轉時,這個Configuration就發生了改變,因此當前顯示的Activity需要被重建,Activity對象會被終止,它的onPause()、onStop()和onDestroy()方法依次觸發,然后一個新的Activity對象被創建,onCreate()方法被觸發。假設屏幕旋轉前,用戶正在手機上填寫一個注冊表單,如果處理不當,用戶會發現旋轉后的表單變成空白的了,嚴重影響使用體驗。
要解決這個問題有三種方法:
方法1:禁止旋轉屏幕
毫無疑問,這是最懶的辦法了,相當于回避了本文提出的問題,方法如下看看就好:
復制代碼 代碼如下:

<activity android:name=".MyActivity"
android:screenOrientation="portrait"
android:label="@string/app_name">

方法2:旋轉后恢復現場
既然Activity會被銷毀,那么我們就可以使用前文介紹過的“持久化/恢復現場”方法來解決。即在onPause()里將用戶當前已經輸入的內容保存到數據庫或Preference,在onCreate()方法里讀取并填充到表單中,這也是官方推薦的方法。
需要補充一點,如果Activity重建需要耗費大量資源或需要訪問網絡導致時間很長,可以實現onRetainNonConfigurationInstance()方法將所需數據先保存到一個對象里,像下面這樣:
復制代碼 代碼如下:

@Override
public Object onRetainNonConfigurationInstance() {
final MyDataObject data = collectMyLoadedData();
return data;
}

重建時,在onCreate()方法里通過getLastNonConfigurationInstance()方法獲得之前保存的數據,如下所示:
復制代碼 代碼如下:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final MyDataObject data = (MyDataObject) getLastNonConfigurationInstance();
if (data == null) {//表示不是由于Configuration改變觸發的onCreate()
data = loadMyData();
}
...
}

方法3:手工處理旋轉
一般情況下Configuration的改變會導致Activity被銷毀重建,但也有辦法讓指定的Configuration改變時不重建Activity,方法是在AndroidManifest.xml里通過android:configChanges屬性指定需要忽略的Configuration名字,例如下面這樣:
復制代碼 代碼如下:

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

這樣設置以后,當屏幕旋轉時Activity對象不會被銷毀――作為替代,Activity的onConfigurationChanged()方法被觸發,在這里開發者可以獲取到當前的屏幕方向以便做必要的更新。既然這種情況下的Activity不會被銷毀,旋轉后Activity里正顯示的信息(例如文本框中的文字)也就不會丟失了。
假如你的應用里,橫屏和豎屏使用同一個layout資源文件,onConfigurationChanged()里甚至可以什么都不做。但如果橫屏與豎屏使用不同的layout資源文件,例如橫屏用res/layout-land/main.xml,豎屏用res/layout-port/main.xml,則必須在onConfigurationChanged()里重新調用setContentView()方法以便新的layout能夠生效,這時雖然Activity對象沒有銷毀,但界面上的各種控件都被銷毀重建了,你需要寫額外的代碼來恢復界面信息。
復制代碼 代碼如下:

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);

// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "橫屏模式", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "豎屏模式", Toast.LENGTH_SHORT).show();
}
}

官方的Android開發文檔不建議使用這種方式處理Configuration改變:
Note: Using this attribute should be avoided and used only as a last-resort. Please read Handling Runtime Changes for more information about how to properly handle a restart due to a configuration change.
最佳實踐
考慮到旋轉屏幕并不是使Activity被銷毀重建的唯一因素,仍然推薦前文介紹過的方法:在onPause()里持久化Activity狀態,在onCreate()里恢復現場,可以做到一舉多得;雖然Google不推薦設置android:configChanges屬性的方式,但如果你的Activity橫向縱向共用同一個layout文件,方法3無疑是最省事的。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品毛片网大全| 精品国产一区二区三区四区在线观看| 国产丝袜一区二区三区免费视频| 久久久久久69| 精品国产一区二区三区在线观看| 国产在线视频不卡| 日韩精品亚洲精品| 日韩欧美在线播放| 成人淫片在线看| 亚洲国产精品悠悠久久琪琪| 欧美性xxxx极品hd满灌| 三级精品视频久久久久| 欧美黄色片免费观看| 欧美激情第三页| 91老司机在线| 亚洲黄色成人网| 日韩一二三在线视频播| 日韩欧美国产中文字幕| 一个人看的www久久| 第一福利永久视频精品| 久久影视电视剧凤归四时歌| 亚洲欧美日韩另类| 精品国产精品三级精品av网址| 欧洲午夜精品久久久| 欧美日韩国产123| 欧美日韩爱爱视频| 91精品在线一区| 琪琪亚洲精品午夜在线| 亚洲国产精品va在线看黑人| 久久成年人免费电影| 2018日韩中文字幕| 亚洲精品美女视频| 日韩高清免费观看| 久久九九亚洲综合| 97超视频免费观看| 久久精品视频va| 91九色国产在线| 久久五月天综合| 日韩视频在线观看免费| 夜夜躁日日躁狠狠久久88av| 亚洲最大成人在线| 国产精品高清网站| 九九精品在线播放| 亚洲成人黄色在线观看| 久久久视频免费观看| 68精品久久久久久欧美| 成人福利免费观看| 国产精品免费久久久久久| 国产美女搞久久| 亚洲精品www久久久| 97免费在线视频| 在线国产精品视频| 欧美性猛交xxxx黑人猛交| 超碰91人人草人人干| 成人在线国产精品| 国产精品jizz在线观看麻豆| 国产一区二区三区18| 国产亚洲成精品久久| 国产美女扒开尿口久久久| 成人国产精品免费视频| 久99九色视频在线观看| 日韩av在线高清| 成人免费福利视频| 91精品国产99久久久久久| 国语对白做受69| 久久视频国产精品免费视频在线| 91九色单男在线观看| 日韩国产中文字幕| 日韩高清中文字幕| 91a在线视频| 91色在线视频| 亚洲va欧美va国产综合剧情| 久久久视频精品| 成人a免费视频| 最近2019年中文视频免费在线观看| 国产精品中文久久久久久久| 色狠狠av一区二区三区香蕉蜜桃| 国产成人福利网站| 欧美日韩人人澡狠狠躁视频| 日韩中文字幕国产| 国产精品一区二区电影| 亚洲摸下面视频| 国产精品色午夜在线观看| 久久精品国产69国产精品亚洲| 国产精品美女久久久久久免费| 国产一区二区黑人欧美xxxx| 亚洲无限乱码一二三四麻| 操人视频在线观看欧美| 91大神在线播放精品| 狠狠躁18三区二区一区| 亚洲欧美日韩第一区| 国产精品成av人在线视午夜片| 久久99久久亚洲国产| 久久av中文字幕| 国产中文字幕亚洲| 亚洲精品v天堂中文字幕| 激情成人在线视频| 日韩av不卡在线| 欧美激情一区二区三区成人| 亚洲精品黄网在线观看| 在线观看日韩www视频免费| 国产精品18久久久久久麻辣| 久久久精品久久久久| 国产网站欧美日韩免费精品在线观看| 91亚洲精品久久久| 日韩电视剧在线观看免费网站| 欧美性在线视频| 中文字幕在线国产精品| 色综合久久88| 国产成人精品一区| 亚洲在线视频福利| 日韩精品视频免费在线观看| 亚洲女成人图区| 精品电影在线观看| 欧美激情videos| 国产91精品黑色丝袜高跟鞋| 欧美成aaa人片在线观看蜜臀| 亚洲精品国产美女| www高清在线视频日韩欧美| xx视频.9999.com| 欧美成人高清视频| 日本韩国在线不卡| 久久成人人人人精品欧| 亚洲女成人图区| 欧美日韩在线看| 国产一区二区免费| 国产激情999| 亚洲图片欧美日产| 欧美国产日本高清在线| 一区二区欧美激情| 国产精品日韩久久久久| 午夜剧场成人观在线视频免费观看| 亚洲国内高清视频| 亚洲xxxx18| 国产大片精品免费永久看nba| 国产ts一区二区| 日本精品免费观看| 91sa在线看| 国产性色av一区二区| 正在播放欧美视频| 久久91超碰青草是什么| 97人人模人人爽人人喊中文字| 欧美乱人伦中文字幕在线| 日本一区二三区好的精华液| 欧美激情欧美狂野欧美精品| 91精品久久久久久久久久| 国产成人极品视频| 国产主播喷水一区二区| 日韩在线中文字| 欧美极品少妇xxxxⅹ免费视频| 中文字幕亚洲自拍| www日韩中文字幕在线看| 狠狠综合久久av一区二区小说| 日韩精品高清在线| 久久成人综合视频| 热99精品里视频精品| 91视频九色网站| 欧美色道久久88综合亚洲精品| 2018日韩中文字幕| 疯狂做受xxxx高潮欧美日本| 亚洲欧美精品中文字幕在线| 日韩精品福利在线| 国产欧美中文字幕| 国产精品福利网站|