日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Configuration change引发的问题及解决方法

發布時間:2025/4/9 Android 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android Configuration change引发的问题及解决方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?之前在學習Fragment和總結Android異步操作的時候會在很多blog中看到對Configuration Change的討論,以前做的項目都是固定豎屏的,所以對橫豎屏切換以及橫豎屏切換對程序有什么影響都沒什么了解。見到的次數多了,總是掠過去心理總覺得不踏實,最終還是好好看了些介紹Congifuration Change的blog,在此做個梳理也不枉花了那么多時間。有疏漏和描述不準確的地方懇請指正。

?

前言

在研究Configuration Change之前我主要的疑問:

?

  • 橫豎屏切換對布局有影響嗎,要做什么處理嗎?
  • 屏幕旋轉的話為什么要保存數據?
  • 啟動一個線程(worker thread或者AsyncTask)來跑一個耗時任務,此時旋轉屏幕會對線程有什么影響嗎?
  • 異步操作過程會顯示進度對話框,旋轉屏幕造成程序終止的原因及解決方法?
  • 在AndroidManifest.xml中通過配置android:configuration的方法來防止Activity被銷毀并重建為什么不被推薦,這種方法有哪些缺點?
  • 推薦使用Fragment的setRetainInstance(true)來處理配置變化時保存對象,具體怎么實現?

?

屏幕方向是設備配置的一個屬性,屏幕旋轉是影響配置變化的因素之一,在項目中最常見。在對Configuration Change有個全面認識后,這些問題都會迎刃而解。

?

由一道網上總結的Android測試題引發的測試

對Configuration Change的第一印象還是看網上總結的Andorid面試題里有問到:

問題:橫豎屏切換時Activity的生命周期?

答案:

1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次

2、設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次

3、設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法

但是經過測試后結果表明并不都和‘答案’一致:

測試環境:在HTC t329d 4.1和模擬器2.2.3上的測試結果:

1、和答案中的第1點不一致。不設置Activity的android:configChanges時,不管切橫屏還是切豎屏,都只會重新調用生命周期一次。

2、和‘答案’中第2點一致

3、和答案中的第3點不一致。設置Activity的android:configChanges=”orientation|keyboardHidden”時,在Android 3.2(API Level 13)之前,切屏還是會重新調用各個生命周期,不會執行onConfigurationChanged()方法。在Android 3.2之后必須在configChanges中添加screenSize才不會在切屏時重新調用各個生命周期。并執行onConfigurationChanged()方法。另:android:targetSdkVersion的設置會影響Activity生命周期的創建,自行測試。

從測試結果和‘答案’的不一致告訴me,對于所謂的'答案'最好親測比較靠譜,而且對于給答案的人最好指明下測試環境,否則測試結果不同也無處對照。全面透徹盡可能多地去覆蓋有關Configuration Change的知識。其實對于第一點,切橫屏還是豎屏導致Activity重建的次數并不重要,重要的是它被重建了以及重建會引發什么問題。

?

Configuration Change概述

Configuration?這個類描述了設備的所有配置信息,這些配置信息會影響到應用程序檢索的資源。包括了用戶指定的選項(locale和scaling)也包括設備本身配置(例如input modes,screen size ?and ?screen orientation).可以在該類里查看所有影響Configuration Change 的屬性。

橫豎屏切換是我們最常見的影響配置變化的因素,還有很多其他影響配置的因素有語言的更改(例如中英文切換)、鍵盤的可用性(這個沒理解)等

?

常見的引發Configuration Change的屬性:

?

橫豎屏切換:android:configChanges="orientation"

?

鍵盤可用性:android:configChanges="keyboardHidden"

?

屏幕大小變化:android:configChanges="screenSize"

?

語言的更改:android:configChanges="locale"

?

在程序運行時,如果發生Configuration Change會導致當前的Activity被銷毀并重新創建,即先調用onDestroy緊接著調用onCreate()方法。重建的目的是為了讓應用程序通過自動加載可替代資源來適應新的配置。

?

?

Configuration Change引發的問題

?

當程序運行時,設備配置的改變會導致當前Activity被銷毀并重新創建。

在Activity被銷毀之前我們需要保存當前的數據以防Activity重建后數據丟失。例如界面中用戶選擇了checkbox和radiobutton選項或者通過網絡請求顯示在界面上的數據在屏幕旋轉后Activity被destroy-recreate,這些控件上被選擇的狀態和界面上的數據都會消失。

再比如當進入某個Activity時加載頁面進行網絡請求,此時旋轉屏幕會重新創建網絡連接請求,這樣的用戶體驗非常不好。而且常見的一個問題是如果伴隨異步操作顯示一個progressDialog的話,異步任務未完成去旋轉屏幕,程序會因為Activity has leaked window 而終止。而當old Activity被銷毀后,線程執行完畢后還是會把結果返回給old Activity而非新的Activity,而且新的Activity如果又觸發了后臺任務(在onCreate()中會啟動線程),就又會去啟動一個子線程,消耗可用的資源。

?

? ? ? ?下面通過一個例子來看看橫豎屏切換引發的以上問題:

?

    • 異步操作結束后旋轉屏幕,界面數據丟失
    • 顯示進度對話框的異步操作,未結束時旋轉屏幕,程序終止

?

該示例,通過點擊屏幕按鈕啟動一個異步操作(模擬執行耗時任務),同時顯示一個進度對話框。當異步操作執行完畢后更新界 面,并取消進度對話框。在本節最后可查看代碼。

? ? ? ? 1. 異步操作結束后旋轉屏幕,界面數據丟失

2. 異步操作未結束旋轉屏幕,程序終止

log打印出的錯誤信息:

?

[plain]?view plaincopy
  • 04-14?21:34:10.192??26254-26254/com.aliao.myandroiddemo?E/WindowManager﹕?Activity?com.aliao.myandroiddemo.view.handler.TestHandlerActivity?has?leaked?window?com.android.internal.policy.impl.PhoneWindow$DecorView@4208a548?that?was?originally?added?here??
  • ????android.view.WindowLeaked:?Activity?com.aliao.myandroiddemo.view.handler.TestHandlerActivity?has?leaked?window?com.android.internal.policy.impl.PhoneWindow$DecorView@4208a548?that?was?originally?added?here??
  • ????????????at?android.view.ViewRootImpl.<init>(ViewRootImpl.java:415)??
  • ????????????at?android.view.WindowManagerImpl.addView(WindowManagerImpl.java:322)??
  • ????????????at?android.view.WindowManagerImpl.addView(WindowManagerImpl.java:234)??
  • ????????????at?android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:153)??
  • ????????????at?android.view.Window$LocalWindowManager.addView(Window.java:557)??
  • ????????????at?android.app.Dialog.show(Dialog.java:277)??
  • ????????????at?android.app.ProgressDialog.show(ProgressDialog.java:116)??
  • ????????????at?android.app.ProgressDialog.show(ProgressDialog.java:104)??
  • ????????????at?com.aliao.myandroiddemo.view.handler.TestHandlerActivity.excuteLongTimeOperation(TestHandlerActivity.java:60)??
  • ????????????at?com.aliao.myandroiddemo.view.handler.TestHandlerActivity.onClick(TestHandlerActivity.java:51)??
  • ????????????at?android.view.View.performClick(View.java:4191)??
  • ????????????at?android.view.View$PerformClick.run(View.java:17229)??
  • ????????????at?android.os.Handler.handleCallback(Handler.java:615)??
  • ????????????at?android.os.Handler.dispatchMessage(Handler.java:92)??
  • ????????????at?android.os.Looper.loop(Looper.java:137)??
  • ????????????at?android.app.ActivityThread.main(ActivityThread.java:4963)??
  • ????????????at?java.lang.reflect.Method.invokeNative(Native?Method)??
  • ????????????at?java.lang.reflect.Method.invoke(Method.java:511)??
  • ????????????at?com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)??
  • ????????????at?com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)??
  • ????????????at?dalvik.system.NativeStart.main(Native?Method)??
  • 04-14?21:34:11.692??????483-635/??E/Watchdog﹕?!@Sync?3825??
  • 04-14?21:34:12.192??????142-142/??E/SMD﹕?DCD?ON??
  • 04-14?21:34:12.502??26254-26254/com.aliao.myandroiddemo?E/AndroidRuntime﹕?FATAL?EXCEPTION:?main??
  • ????java.lang.IllegalArgumentException:?View?not?attached?to?window?manager??
  • ????????????at?android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:696)??
  • ????????????at?android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:379)??
  • ????????????at?android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:164)??
  • ????????????at?android.app.Dialog.dismissDialog(Dialog.java:319)??
  • ????????????at?android.app.Dialog.dismiss(Dialog.java:302)??
  • ????????????at?com.aliao.myandroiddemo.view.handler.TestHandlerActivity$1.handleMessage(TestHandlerActivity.java:87)??
  • ????????????at?android.os.Handler.dispatchMessage(Handler.java:99)??
  • ????????????at?android.os.Looper.loop(Looper.java:137)??
  • ????????????at?android.app.ActivityThread.main(ActivityThread.java:4963)??
  • ????????????at?java.lang.reflect.Method.invokeNative(Native?Method)??
  • ????????????at?java.lang.reflect.Method.invoke(Method.java:511)??
  • ????????????at?com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)??
  • ????????????at?com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)??
  • ????????????at?dalvik.system.NativeStart.main(Native?Method)??

  • ?

    該示例的代碼:

    res/layout/activity_handler.xml——TestHandlerActivity的布局文件

    ?

    [html]?view plaincopy
  • <?xml?version="1.0"?encoding="utf-8"?>??
  • ??
  • <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  • ????android:orientation="vertical"?android:layout_width="match_parent"??
  • ????android:layout_height="match_parent">??
  • ??
  • ????<TextView??
  • ????????android:layout_width="match_parent"??
  • ????????android:layout_height="wrap_content"??
  • ????????android:text="通過點擊按鈕來啟動一個線程模擬運行一個網絡耗時操作,獲取新聞詳情并顯示在按鈕下面"??
  • ????????android:textSize="16sp"/>??
  • ??
  • ????<Button??
  • ????????android:layout_width="wrap_content"??
  • ????????android:layout_height="wrap_content"??
  • ????????android:text="獲取MH370航班最新新聞動態"??
  • ????????android:textSize="16sp"??
  • ????????android:id="@+id/btn_createthread"??
  • ????????android:layout_gravity="center_horizontal"?/>??
  • ??
  • ????<TextView??
  • ????????android:layout_width="match_parent"??
  • ????????android:layout_height="match_parent"??
  • ????????android:textAppearance="?android:attr/textAppearanceLarge"??
  • ????????android:textColor="@android:color/holo_green_dark"??
  • ????????android:textSize="16sp"??
  • ????????android:id="@+id/tv_showsth"??
  • ????????android:layout_marginTop="10dp"/>??
  • ??
  • </LinearLayout>??

  • ?

    TestHandlerActivity——進行異步操作,獲取數據并更新界面

    ?

    [java]?view plaincopy
  • package?com.aliao.myandroiddemo.view.handler;??
  • ??
  • import?android.app.Activity;??
  • import?android.app.ProgressDialog;??
  • import?android.content.res.Configuration;??
  • import?android.os.Bundle;??
  • import?android.os.Handler;??
  • import?android.os.Message;??
  • import?android.util.Log;??
  • import?android.view.View;??
  • import?android.widget.Button;??
  • import?android.widget.TextView;??
  • ??
  • import?com.aliao.myandroiddemo.R;??
  • import?com.aliao.myandroiddemo.utils.ThreadUtil;??
  • ??
  • /**?
  • ?*?Created?by?liaolishuang?on?14-4-9.?
  • ?*/??
  • public?class?TestHandlerActivity?extends?Activity?implements?View.OnClickListener{??
  • ??
  • ????private?final?String????TAG?=?"testhandler";??
  • ????private?TextView????????showNewsInfoTxt;??
  • ????private?ProgressDialog??progressDialog;??
  • ????private?String??????????newsInfo;??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_handler);??
  • ????????//打印當前線程的部分信息??
  • ????????ThreadUtil.logThreadSignature();??
  • ????????Button?anrBtn?=?(Button)?findViewById(R.id.btn_createthread);??
  • ????????anrBtn.setOnClickListener(this);??
  • ????????showNewsInfoTxt?=?(TextView)?findViewById(R.id.tv_showsth);??
  • ????????if(getResources().getConfiguration().orientation?==?Configuration.ORIENTATION_LANDSCAPE){??
  • ????????????Log.i(TAG,?"----onCreate?-?landscape---");??
  • ????????}else?if(getResources().getConfiguration().orientation?==?Configuration.ORIENTATION_PORTRAIT){??
  • ????????????Log.i(TAG,?"----onCreate?-?portrait?---");??
  • ????????}??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?onClick(View?view)?{??
  • ????????switch?(view.getId()){??
  • ????????????case?R.id.btn_createthread:??
  • ???????????????excuteLongTimeOperation();??
  • ????????????????break;??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?點擊按鈕,創建子線程,并顯示一個進度對話框?
  • ?????*/??
  • ????private?void?excuteLongTimeOperation()?{??
  • ????????progressDialog?=?ProgressDialog.show(TestHandlerActivity.this,"Load?Info","Loading...",true,true);??
  • ????????Thread?workerThread?=?new?Thread(new?MyNewThread());??
  • ????????workerThread.start();??
  • ????}??
  • ??
  • ????class?MyNewThread?extends?Thread{??
  • ????????@Override??
  • ????????public?void?run()?{??
  • ????????????//打印子線程的部分信息??
  • ????????????ThreadUtil.logThreadSignature();??
  • ????????????//模擬執行耗時操作??
  • ????????????ThreadUtil.sleepForInSecs(5);??
  • ????????????newsInfo?=?"#搜尋馬航370#【澳聯合協調中心今日記者會要點】1.發現油跡的地點距離信號發現地很近,油跡來源需進一步調查。2.黑匣子一般只有30天壽命,最多40天,今天已經是第38天了,但仍有可能收到信號";??
  • ????????????Message?message?=?handler.obtainMessage();??
  • ????????????Bundle?bundle?=?new?Bundle();??
  • ????????????bundle.putString("message",newsInfo);??
  • ????????????message.setData(bundle);??
  • ????????????handler.sendMessage(message);??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?以匿名類的形式創建handler?
  • ?????*/??
  • ????private?Handler?handler?=?new?Handler(){??
  • ????????@Override??
  • ????????public?void?handleMessage(Message?msg)?{??
  • ????????????progressDialog.dismiss();??
  • ????????????//更新界面中TextView中的內容??
  • ????????????refreshNewsInfo(msg.getData().getString("message"));??
  • ????????}??
  • ????};??
  • ??
  • ????/**?
  • ?????*?更新界面內容?
  • ?????*?@param?newsInfo?
  • ?????*/??
  • ????private?void?refreshNewsInfo(String?newsInfo)?{??
  • ????????showNewsInfoTxt.setText(newsInfo);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?只有在AndroidManifest.xml中對該Activity設置android:configChanges,該方法才會被回調?
  • ?????*?@param?newConfig?
  • ?????*/??
  • ????@Override??
  • ????public?void?onConfigurationChanged(Configuration?newConfig)?{??
  • ????????super.onConfigurationChanged(newConfig);??
  • ????????Log.i(TAG,?"----onConfigurationChanged---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onDestroy()?{??
  • ????????super.onDestroy();??
  • ????????Log.i(TAG,?"====onDestroy====");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onStart()?{??
  • ????????super.onStart();??
  • ????????Log.i(TAG,?"----onStart---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onResume()?{??
  • ????????super.onResume();??
  • ????????Log.i(TAG,?"----onResume---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onRestart()?{??
  • ????????super.onRestart();??
  • ????????Log.i(TAG,?"----onRestart---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onPause()?{??
  • ????????super.onPause();??
  • ????????Log.i(TAG,?"----onPause---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onStop()?{??
  • ????????super.onStop();??
  • ????????Log.i(TAG,?"----onStop---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onSaveInstanceState(Bundle?outState)?{??
  • ????????super.onSaveInstanceState(outState);??
  • ????????Log.i(TAG,?"----onSaveInstanceState---");??
  • ????}??
  • ??
  • }??
  • ?

    ?

    解決方案

    一、禁止屏幕旋轉

    禁止屏幕旋轉,也就無需考慮Configuration Change引發的問題

    在AcndroidManifest.xml里設置Activity的screenOrientation屬性為landscape(橫屏)或者portrait(豎屏)

    ?

    [java]?view plaincopy
  • <activity??
  • ????android:name="com.aliao.myandroiddemo.view.handler.TestHandlerActivity"??
  • ????android:label="@string/title_activity_animation"??
  • ????android:screenOrientation="portrait">??
  • </activity>??


  • ?

    二、避免Activity重建

    ?

    ?

    ?

    1.配置andoird:configChanges屬性并回調onConfigurationChanged()手動處理

    ?

    ?

    Handling the Configuration Change Yours?里指出如果應用程序不需要在一個特定的configuration change期間更新資源(例如程序在橫屏和豎屏不同屏幕大小下不考慮資源調整),以及有防止activity重啟的性能限制,就可以通過該方法來阻止系統重啟activity。但是Google并不推薦使用該方法。

    ?

    上一節討論了在某些情況下由于橫豎屏切換導致的一系列問題,引起這些問題的源頭是因為Configuration Change會導致Activity被重建。如果Activity不被銷毀再重建也就沒有所謂的數據丟失,異步操作過程中內存泄露程序終止等問題了。Android提供了一種方法來避免Activity被重建:

    在AndroidManifest.xml里通過android:configChanges指定要忽略的配置,例如:

    ?

    [java]?view plaincopy
  • <activity??
  • ????android:name="com.aliao.myandroiddemo.view.handler.TestHandlerActivity"??
  • ????android:configChanges="orientation|keyboardHidden"??
  • ????android:label="@string/title_activity_animation">??
  • </activity>??
  • Caution:需要注意的是,在Android 3.2(API Level 13)開始,橫豎屏切換也會導致"screen size"(Configuraion的一個屬性)改變,所以要在android:configChanges加上該值android:configChanges="orientation|screenSize",否則當切換屏幕時,activity仍會被重建。

    ?

    ?

    [java]?view plaincopy
  • <activity??
  • ????android:name="com.aliao.myandroiddemo.view.handler.TestHandlerActivity"??
  • ????android:configChanges="orientation|screenSize|keyboardHidden"??
  • ????android:label="@string/title_activity_animation">??
  • </activity>??
  • ?

    設置了android:configChanges后,Activity會在配置改變時只回調onConfigurationChanged(Configuration newConfig),不會重新走一遍Activity的生命周期:

    啟動TestHandlerActivity顯示界面Activity生命周期為:onCreate->onStart->onResume:

    ?

    [plain]?view plaincopy
  • 04-14?22:56:18.092??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onCreate?-?portrait?---??
  • 04-14?22:56:18.092??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onStart---??
  • 04-14?22:56:18.092??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onResume---??
  • 豎屏切橫屏,只回調了onConfigurationChanged:

    ?

    ?

    [plain]?view plaincopy
  • 04-14?22:59:29.912??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onCreate?-?portrait?---??
  • 04-14?22:59:29.912??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onStart---??
  • 04-14?22:59:29.912??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onResume---??
  • 04-14?22:59:33.442??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onConfigurationChanged---??
  • 切回豎屏,同樣只回調onConfigurationChanged:

    ?

    ?

    [plain]?view plaincopy
  • 04-14?23:01:02.232??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onCreate?-?portrait?---??
  • 04-14?23:01:02.232??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onStart---??
  • 04-14?23:01:02.232??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onResume---??
  • 04-14?23:01:04.192??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onConfigurationChanged---??
  • 04-14?23:01:05.492??32095-32095/com.aliao.myandroiddemo?I/testhandler﹕?----onConfigurationChanged---??

  • 如果橫豎屏的界面布局不同,可以再res下新建layout-land目錄和layout-port目錄,然后把布局文件扔到這兩個目錄文件中:

    ?

    res/layout-land/layout_main.xml

    res/layout-port/layout_main.xml

    當程序運行的時候會自動判斷當前的屏幕方向去layout里調用對應的布局文件。
    我們可以在onConfigurationChanged方法中對某些資源做調整

    ?

    [java]?view plaincopy
  • @Override??
  • public?void?onConfigurationChanged(Configuration?newConfig)?{??
  • ????super.onConfigurationChanged(newConfig);??
  • ??
  • ????//?Checks?the?orientation?of?the?screen??
  • ????if?(newConfig.orientation?==?Configuration.ORIENTATION_LANDSCAPE)?{??
  • ????????Toast.makeText(this,?"landscape",?Toast.LENGTH_SHORT).show();??
  • ????}?else?if?(newConfig.orientation?==?Configuration.ORIENTATION_PORTRAIT){??
  • ????????Toast.makeText(this,?"portrait",?Toast.LENGTH_SHORT).show();??
  • ????}??
  • 如果不管屏幕配置變不變化,程序中使用的資源不會改變,可以不用實現onConfigurationChanged()回調。

    ?

    2.不推薦<通過設置android:configChanges屬性的方法來避免activity被銷毀再重建>的原因

    ?

    這個方法真的很方便,在運行上面的實例代碼時,完全可以正常運行沒有任何錯誤。但是他也是指某種情形下適用,看了以下不推薦適用的原因后,還是掌握第二種方法比較靠譜!

    先看Android Developers里怎么說的:

    ?

    ?

    Note:?Handling the configuration change yourself can make it muchmore difficult to use alternative resources, because the system does not automatically apply them for you. This technique should be considered a last resort when you must avoid restarts due to aconfiguration change and?is not recommended for most applications.

    ?

    ?

    However, your application should always be able to shut down and restart with its previous state intact, so you should not consider this technique an escape from retaining your state during normal activity lifecycle. Not only because there are other configuration changes that you cannot prevent from restarting your application, butalso because you should handle events such as when the user leaves your application and it gets destroyed before the user returns to it.

    ?

    1.??配置改變和資源調整的問題,因為用這個方法我們需要自己往onConfigurationChanged()里寫代碼,保證所用資源和設備的 當前配置一致,如果一個馬虎程序很容易出現資源指定的bugs,原文:

    ?

    Google engineers,however, discourage its use. The primary concern is that it requires youto handle device configuration changes manually in code. Handling configuration changes requires you to take many additional steps to ensure that each and every string, layout, drawable, dimension, etc.remains in sync with the device's current configuration, and if you aren't careful, your application can easily have a whole series of resource-specific bugs as a result.——Handling Configuration Changes With Fragments

    ?

    2.?there are other configuration changes that you cannot prevent from restarting your application.有些configuration ? ? ?changes沒法阻止應用重啟。(是說的有些android:configChanges的屬性值對避免重建無效?不知道理解是否正確)

    3.?很多開發人員會錯誤指定android:configChanges="orientation"來防止activity被銷毀或重建這種不可預知的情況。但是引起Configuration Changes的情況很多,不止是屏幕旋轉。比如修改設備默認語言,修改設備默認字體比例等等都可會引起配置改變。這種方法只對當前設置的配置有效,除非在manifest里把所有配置都列全。

    4.?當用戶離開應用,在回到應用前被銷毀的話,例如點擊了屏幕的Home鍵或者有個電話打進來,用戶很久之后才回到應用程序,但是在此之前系統因為資源緊張而銷毀了應用進程,當用戶返回還是要重新創建activity,問題等于沒解決。

    ?

    Your application should be able to restart at any time without loss of user data or state in order to handle events such as configuration changes or when the user receives an incoming phone call and then returns to your application much later after your application process may have been destroyed.——Handling Runtime Changes

    ?

    As a user you won't stay on that activity and stare at it. You would switch to the home screen or to another app like a game or a phone call might come in or something else resource hungry that will eventually destroy your activity. And what then? You are facing the same old issue which is NOT solved with that neat little trick. The activity will be recreated all over again when the user comes back.——How to handle screen orientation change when progress dialog and background thread active?中的一個評論

    ?

    三、覆寫onRetainNonConfigurationInstance()來保留activity中的數據對象

    在Android 3.0發布之前,處理Configuration Change的方法是覆寫onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()方法。在onRetainNonConfigurationInstance()中返回對象(持有數據),再通過getLastNonConfigurationInstance()方法獲取該對象,再更新界面數據即可。看個例子就很容易明白了,修改TestHandlerActivity代碼如下:

    ?

    [java]?view plaincopy
  • public?class?TestHandlerActivity?extends?Activity?implements?View.OnClickListener{??
  • ??
  • ????private?final?String????TAG?=?"testhandler";??
  • ????private?TextView????????showNewsInfoTxt;??
  • ????private?ProgressDialog??progressDialog;??
  • ????private?String??????????newsInfo;??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_handler);??
  • ????????//打印當前線程的部分信息??
  • ????????ThreadUtil.logThreadSignature();??
  • ????????Button?anrBtn?=?(Button)?findViewById(R.id.btn_createthread);??
  • ????????anrBtn.setOnClickListener(this);??
  • ????????showNewsInfoTxt?=?(TextView)?findViewById(R.id.tv_showsth);??
  • ????????if(getResources().getConfiguration().orientation?==?Configuration.ORIENTATION_LANDSCAPE){??
  • ????????????Log.i(TAG,?"----onCreate?-?landscape---");??
  • ????????}else?if(getResources().getConfiguration().orientation?==?Configuration.ORIENTATION_PORTRAIT){??
  • ????????????Log.i(TAG,?"----onCreate?-?portrait?---");??
  • ????????}??
  • ????????String?retain?=?(String)?getLastNonConfigurationInstance();??
  • ????????if?(retain?!=?null){??
  • ????????????refreshNewsInfo(retain);??
  • ????????}else{??
  • ????????????//進入Activity后立馬加載數據??
  • ????????????excuteLongTimeOperation();??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?返回異步操作中獲取到的數據?
  • ?????*?@return?
  • ?????*/??
  • ????@Override??
  • ????public?Object?onRetainNonConfigurationInstance()?{??
  • ????????return?newsInfo;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?點擊按鈕,創建子線程,并顯示一個進度對話框?
  • ?????*/??
  • ????private?void?excuteLongTimeOperation()?{??
  • ????????progressDialog?=?ProgressDialog.show(TestHandlerActivity.this,"Load?Info","Loading...",true,true);??
  • ????????Thread?workerThread?=?new?Thread(new?MyNewThread());??
  • ????????workerThread.start();??
  • ????}??
  • //省略其他代碼??
  • }??


  • ?

    ?

    三、推薦使用Fragment來處理Configuration Change

    具體步驟如下:

    1.?Extend theFragment?class and declare references to your stateful objects.

    2.?CallsetRetainInstance(boolean)?when the fragment is created. ?

    3. Add the fragment to your activity.

    4. Use?FragmentManager?to retrieve the fragment when the activity is restarted.

    定義一個RetainedFragment類:

    ?

    [java]?view plaincopy
  • package?com.aliao.myandroiddemo.view.handler;??
  • ??
  • import?android.app.Activity;??
  • import?android.net.Uri;??
  • import?android.os.Bundle;??
  • import?android.os.Handler;??
  • import?android.os.Message;??
  • import?android.support.v4.app.Fragment;??
  • import?com.aliao.myandroiddemo.utils.ThreadUtil;??
  • ??
  • ??
  • /**?
  • ?*?A?simple?{@link?android.support.v4.app.Fragment}?subclass.?
  • ?*?Activities?that?contain?this?fragment?must?implement?the?
  • ?*?{@link?RetaindFragment.OnFragmentInteractionListener}?interface?
  • ?*?to?handle?interaction?events.?
  • ?*?
  • ?*/??
  • public?class?RetaindFragment?extends?Fragment?{??
  • ??
  • ????private?OnFragmentInteractionListener?mListener;??
  • ??
  • ????@Override??
  • ????public?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????//retain?ths?fragment??
  • ????????setRetainInstance(true);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?點擊按鈕,創建子線程,并顯示一個進度對話框?
  • ?????*/??
  • ????public?void?excuteLongTimeOperation()?{??
  • ????????Thread?workerThread?=?new?Thread(new?MyNewThread());??
  • ????????workerThread.start();??
  • ????}??
  • ??
  • ????class?MyNewThread?extends?Thread{??
  • ????????@Override??
  • ????????public?void?run()?{??
  • ????????????//打印子線程的部分信息??
  • ????????????ThreadUtil.logThreadSignature();??
  • ????????????//模擬執行耗時操作??
  • ????????????ThreadUtil.sleepForInSecs(5);??
  • ????????????String?newsInfo?=?"#搜尋馬航370#【澳聯合協調中心今日記者會要點】1.發現油跡的地點距離信號發現地很近,油跡來源需進一步調查。2.黑匣子一般只有30天壽命,最多40天,今天已經是第38天了,但仍有可能收到信號";??
  • ????????????Message?message?=?handler.obtainMessage();??
  • ????????????Bundle?bundle?=?new?Bundle();??
  • ????????????bundle.putString("message",newsInfo);??
  • ????????????message.setData(bundle);??
  • ????????????handler.sendMessage(message);??
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?以匿名類的形式創建handler?
  • ?????*/??
  • ????private?Handler?handler?=?new?Handler(){??
  • ????????@Override??
  • ????????public?void?handleMessage(Message?msg)?{??
  • ??
  • ????????????//更新界面中TextView中的內容??
  • ????????????if(mListener?!=?null){??
  • ????????????????mListener.onFragmentInteraction(msg.getData().getString("message"));??
  • ????????????}??
  • ????????}??
  • ????};??
  • ??
  • ??
  • ??
  • ????//?TODO:?Rename?method,?update?argument?and?hook?method?into?UI?event??
  • ????public?void?onButtonPressed(String?string)?{??
  • ????????if?(mListener?!=?null)?{??
  • ????????????mListener.onFragmentInteraction(string);??
  • ????????}??
  • ????}??
  • ??
  • ??
  • ??
  • ????@Override??
  • ????public?void?onAttach(Activity?activity)?{??
  • ????????super.onAttach(activity);??
  • ????????try?{??
  • ????????????mListener?=?(OnFragmentInteractionListener)?activity;??
  • ????????}?catch?(ClassCastException?e)?{??
  • ????????????throw?new?ClassCastException(activity.toString()??
  • ????????????????????+?"?must?implement?OnFragmentInteractionListener");??
  • ????????}??
  • ??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?onDetach()?{??
  • ????????super.onDetach();??
  • ????????mListener?=?null;??
  • ????}??
  • ??
  • ????/**?
  • ?????*?This?interface?must?be?implemented?by?activities?that?contain?this?
  • ?????*?fragment?to?allow?an?interaction?in?this?fragment?to?be?communicated?
  • ?????*?to?the?activity?and?potentially?other?fragments?contained?in?that?
  • ?????*?activity.?
  • ?????*?<p>?
  • ?????*?See?the?Android?Training?lesson?<a?href=?
  • ?????*?"http://developer.android.com/training/basics/fragments/communicating.html"?
  • ?????*?>Communicating?with?Other?Fragments</a>?for?more?information.?
  • ?????*/??
  • ????public?interface?OnFragmentInteractionListener?{??
  • ????????//?TODO:?Update?argument?type?and?name??
  • ????????public?void?onFragmentInteraction(String??string);??
  • ????}??
  • ??
  • }??
  • 這個Fragment沒有界面,它用來處理異步操作,然后把結果就該界面的部分返回給Activity來處理,Activity會實現Fragment中定義的OnFragmentInteractionListener接口中的onFragmentInteraction(String string)方法(Fragment與Activity之間的通訊),這個接口我們可以自己定義。把之前在TestHandlerActivity中的異步操作移植到RetainedFragemnt類中。

    ?

    TestHandlerActivity對應的布局文件activity_handler.xml修改代碼如下:

    ?

    [html]?view plaincopy
  • <?xml?version="1.0"?encoding="utf-8"?>??
  • ??
  • <LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  • ????android:orientation="vertical"?android:layout_width="match_parent"??
  • ????android:layout_height="match_parent">??
  • ??
  • ????<TextView??
  • ????????android:layout_width="match_parent"??
  • ????????android:layout_height="wrap_content"??
  • ????????android:text="通過點擊按鈕來啟動一個線程模擬運行一個網絡耗時操作,獲取新聞詳情并顯示在按鈕下面"??
  • ????????android:textSize="16sp"/>??
  • ??
  • ????<Button??
  • ????????android:layout_width="wrap_content"??
  • ????????android:layout_height="wrap_content"??
  • ????????android:text="獲取MH370航班最新新聞動態"??
  • ????????android:textSize="16sp"??
  • ????????android:id="@+id/btn_createthread"??
  • ????????android:layout_gravity="center_horizontal"?/>??
  • ??
  • ????<ProgressBar??
  • ????????android:id="@+id/progress_circular"??
  • ????????android:layout_width="wrap_content"??
  • ????????android:layout_height="wrap_content"??
  • ????????android:layout_margin="10dp"??
  • ????????style="@android:style/Widget.ProgressBar.Small"??
  • ????????android:visibility="gone"??
  • ????????android:layout_gravity="center_horizontal"/>??
  • ??
  • ????<TextView??
  • ????????android:layout_width="match_parent"??
  • ????????android:layout_height="match_parent"??
  • ????????android:textAppearance="?android:attr/textAppearanceLarge"??
  • ????????android:textColor="@android:color/holo_green_dark"??
  • ????????android:textSize="16sp"??
  • ????????android:id="@+id/tv_showsth"??
  • ????????android:layout_marginTop="10dp"/>??
  • ??
  • ??
  • ??
  • ??
  • </LinearLayout>??
  • ?

    ?

    TestHandlerActivity中的代碼修改如下:

    ?

    [java]?view plaincopy
  • package?com.aliao.myandroiddemo.view.handler;??
  • ??
  • import?android.app.Activity;??
  • import?android.app.ProgressDialog;??
  • import?android.content.res.Configuration;??
  • import?android.os.Bundle;??
  • import?android.os.Handler;??
  • import?android.os.Message;??
  • import?android.support.v4.app.FragmentActivity;??
  • import?android.support.v4.app.FragmentManager;??
  • import?android.util.Log;??
  • import?android.view.View;??
  • import?android.widget.Button;??
  • import?android.widget.ProgressBar;??
  • import?android.widget.TextView;??
  • ??
  • import?com.aliao.myandroiddemo.R;??
  • import?com.aliao.myandroiddemo.utils.ThreadUtil;??
  • ??
  • /**?
  • ?*?Created?by?liaolishuang?on?14-4-9.?
  • ?*/??
  • public?class?TestHandlerActivity?extends?FragmentActivity?implements?View.OnClickListener,RetaindFragment.OnFragmentInteractionListener{??
  • ??
  • ????private?final?String????TAG?=?"testhandler";??
  • ????private?TextView????????showNewsInfoTxt;??
  • ????private?ProgressDialog??progressDialog;??
  • ????private?ProgressBar?????progressBar;??
  • ????private?String??????????newsInfo;??
  • ????private?RetaindFragment?dataFragment;??
  • ????private?static?final?String?KEY_CURRENT_NEWSDATA?=?"current_nesdata";??
  • ??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_handler);??
  • ????????Log.i(TAG,?"----onCreate---");??
  • ????????//打印當前線程的部分信息??
  • ????????ThreadUtil.logThreadSignature();??
  • ????????Button?anrBtn?=?(Button)?findViewById(R.id.btn_createthread);??
  • ????????anrBtn.setOnClickListener(this);??
  • ????????showNewsInfoTxt?=?(TextView)?findViewById(R.id.tv_showsth);??
  • ????????progressBar?=?(ProgressBar)?findViewById(R.id.progress_circular);??
  • ????????if(null?!=?savedInstanceState){??
  • ????????????refreshNewsInfo((String)?savedInstanceState.get(KEY_CURRENT_NEWSDATA));??
  • ????????}??
  • ??
  • ????????//在activity重啟時獲取到保留的fragment對象??
  • ????????FragmentManager?fm?=?getSupportFragmentManager();??
  • ????????dataFragment?=?(RetaindFragment)?fm.findFragmentByTag("data");??
  • ????????if(null?==?dataFragment){??
  • ????????????//添加fragment??
  • ????????????dataFragment?=?new?RetaindFragment();??
  • ????????????fm.beginTransaction().add(dataFragment,?"data").commit();??
  • ????????????//從網上下載數據??
  • ??????????????
  • ????????}??
  • ????}??
  • ??
  • ??
  • ????@Override??
  • ????public?void?onClick(View?view)?{??
  • ????????switch?(view.getId()){??
  • ????????????case?R.id.btn_createthread:??
  • ????????????????progressBar.setVisibility(View.VISIBLE);??
  • //????????????????progressDialog?=?ProgressDialog.show(TestHandlerActivity.this,"Load?Info","Loading...",true,true);??
  • ????????????????//控制RetainFragment中的子線程啟動??
  • ????????????????dataFragment.excuteLongTimeOperation();??
  • ????????????????break;??
  • ????????}??
  • ????}??
  • ??
  • ????@Override??
  • ????public?void?onFragmentInteraction(String?newsInfo)?{??
  • ????????this.newsInfo?=?newsInfo;??
  • ????????refreshNewsInfo(newsInfo);??
  • ????}??
  • ??
  • ????/**?
  • ?????*?更新界面內容?
  • ?????*?@param?newsInfo?
  • ?????*/??
  • ????private?void?refreshNewsInfo(String?newsInfo)?{??
  • ????????progressBar.setVisibility(View.GONE);??
  • ????????showNewsInfoTxt.setText(newsInfo);??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onSaveInstanceState(Bundle?outState)?{??
  • ????????super.onSaveInstanceState(outState);??
  • ????????outState.putString(KEY_CURRENT_NEWSDATA,showNewsInfoTxt.getText().toString());//注意不要直接傳newsInfo,否則在異步操作執行完成后旋轉屏幕,內容還是會消失。因為該值只有在屏幕旋轉的時候才賦值,??
  • ????????Log.i(TAG,?"----onSaveInstanceState---");??
  • ????}??
  • ??
  • ????/**?
  • ?????*?只有在AndroidManifest.xml中對該Activity設置android:configChanges,該方法才會被回調?
  • ?????*?@param?newConfig?
  • ?????*/??
  • ????@Override??
  • ????public?void?onConfigurationChanged(Configuration?newConfig)?{??
  • ????????super.onConfigurationChanged(newConfig);??
  • ????????Log.i(TAG,?"----onConfigurationChanged---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onDestroy()?{??
  • ????????super.onDestroy();??
  • ????????Log.i(TAG,?"====onDestroy====");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onStart()?{??
  • ????????super.onStart();??
  • ????????Log.i(TAG,?"----onStart---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onResume()?{??
  • ????????super.onResume();??
  • ????????Log.i(TAG,?"----onResume---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onRestart()?{??
  • ????????super.onRestart();??
  • ????????Log.i(TAG,?"----onRestart---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onPause()?{??
  • ????????super.onPause();??
  • ????????Log.i(TAG,?"----onPause---");??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onStop()?{??
  • ????????super.onStop();??
  • ????????Log.i(TAG,?"----onStop---");??
  • ????}??
  • ??
  • ??
  • ??
  • }??
  • 在異步操作還未執行完畢的時候旋轉屏幕,TestHandlerActivity會被銷毀再重建。新的TestHandlerActivity被創建,新的Activity實例會傳送給onAttach(Activity)方法,通過打印onAttach中的activity可以看到屏幕旋轉前后onAttach綁定的activity不同。這樣就確保不管配置是否改變RetainedFragment持有的都是當前展示的Activity的引用。

    ?

    在以上的示例中onSaveInstanceState的作用是在異步操作完畢時旋轉屏幕確保屏幕數據不丟失。

    onSaveInstanceState:?it might not be possible for you to completely restore youractivity state with theBundle?that the system saves for you with theonSaveInstanceState()?callback—it is notdesigned to carry large objects (such as bitmaps) and the data within it must be serialized thendeserialized, which can consume a lot of memory and make the configuration change slow.——Handling Runtime Changes

    ?

    異步操作顯示對話框在Configuration Changes時導致程序崩潰

    之前看到一篇講內存泄露的文章,其中一個內存泄露的情境和上面的實例代碼情境很類似,大意是:在Activity里創建一個子線程來跑耗時操作,在異步操作沒結束前旋轉屏幕,線程沒執行完,old Activity也就不會被銷毀,會導致內存泄露。摘取部分原文內容: “由于我們的線程是Activity的內部類,所以MyThread中保存了Activity的一個引用,當MyThread的run函數沒有結束時,MyThread是不會被銷毀的,因此它所引用的老的Activity也不會被銷毀,因此就出現了內存泄露的問題。” “Thread只有在run函數不結束時才出現這種內存泄露問題” 用圖來表示上述內容的話,應該是:

    看完這圖就delete掉記憶吧,錯滴錯滴

    ?

    他這段話誤導了我好一陣:“線程的run函數沒有結束,線程不會被銷毀,他所引用的老activity也不會被銷毀。所以出現了內存泄露。”在這種理解的基礎上,我一直以為帶進度對話框的異步操作在屏幕旋轉的時候出現程序終止,是因為線程沒結束,activity不銷毀,所以導致了內存泄露。而且logcat下還打印了這么一句:

    ?

    04-16 00:26:18.703 ?17075-17075/com.aliao.myandroiddemo E/WindowManager﹕ Activity com.aliao.myandroiddemo.view.handler.TestHandlerActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41f9a990 that was originally added here

    ?

    當時我就一直為了驗證心里早已固定的認同感,看到“TestHandlerActivity has leaked”TestHandlerActivity已經泄露了...就不加思考的去相信了。

    ?

    但是今天在看有關于異步操作帶對話框在configuration change時的處理辦法時,總有一個疑問就是舊的activity會在線程結束的時候被銷毀嗎?后來做了測試,代碼用的還是<Configuration Changes引發的問題>里最后貼的代碼:

    ?

    測試設備:HTC t329d Android4.1

    ?

    測試操作:點擊按鈕啟動線程,旋轉屏幕,記錄Activity被銷毀時間,查看debug模式下的Threads列表記錄線程消失時間

    ?

    測試條件一:異步操作執行時長5秒

    ?

    測試一結果:Activity的onDestroy調用的時間比worker thread結束時間晚或相等(這條件下就測了兩次)。

    ?

    測試條件二:異步操作執行時長20秒

    ?

    測試二結果:啟動線程的時間:00:08:58

    ?

    ? ? ? ? ? ? ? ? ? ? ?activity的onDestroy()調用時間:00:09:04

    ?

    ? ? ?thread的在Threads列表消失時間:00:09:18

    ?

    ? ? ? 可以看到old activity的銷毀時間在thread結束之前!!!

    ?

    測試結果表明:activity并不是在thread結束后才銷毀。這與之前說的“thread沒有銷毀導致被持有引用的activity也不會銷毀”相互矛盾!所以因為這個原因導致的內存泄露的說法就更沒有說服力了。

    ?

    再看之前log打印的錯誤:

    ?

    1. WindowManager﹕ Activity com.aliao.myandroiddemo.view.handler.TestHandlerActivity has leaked windowcom.android.internal.policy.impl.PhoneWindow$DecorView@41f9a990 that was originally added here

    ?

    不是TestHandlerActivity has leaked

    ?

    2. java.lang.IllegalArgumentException:View not attached to window manager

    ?

    這個錯誤的發生是因為dismiss對話框時,所屬Activity已經不在了。

    ?

    經過上面的測試和打印的錯誤log可以得出:這個bug不是因為old activity沒銷毀導致內存泄露,而是activity被銷毀后 progressDialog還持有這個activity的引用。異步任務開始時顯示對話框,任務完成后去取消progressDialog。當任務沒結束時旋轉屏幕,會導致old activity被銷毀,然后到了線程執行結束要dismiss progressDialog的時候發現所屬的activity已經不在了。

    解決辦法(如果有其他好方法,推薦下下哇):

    1.在布局文件創建progressBar來代替progressDialog

    2. 創建一個AsyncTask的時候把當前Activity的引用傳給其構造函數。onRetainNonConfigurationInstance()中判斷線程是否結束,如果結束了就把progressDialog取消掉,然后將AsyncTask對象mTask返回。在onCreate中通過getLastNonConfigurationInstance()接收mTask,關聯當前activity——mtask.mContext = this;再重新啟動一個progressDialog。保證了progressDialog在actviity銷毀錢被dismiss掉。from?How to handle screen orientation change when progress dialog and background thread active?中的其中一個回答。單單只是測試progressDialog在橫豎屏切換時是否會崩潰,測試結果是正常的。

    3.網上還有說用IntentService來解決,沒用過這個,先不測了。

    遺留問題:

    ?

    1.在Configuration Changes引發的問題一節中 "there are other configuration changes that you cannot prevent from restarting your application."該怎么正確的翻譯和理解

    2. 在Configuration Changes引發的問題一節中的第四點怎么理解才是正確的。不知道這種情況發生的情境,應用進程被銷毀是等于整個app被kill掉,那不就是又重新打開app,重新進入activity也是正常的步驟。重新進入再重新請求唄。

    ?

    參考資料:

    強烈推薦閱讀 Handling Runtime Changes?——來自Android Developers,介紹Configuration changes及其對數據丟失的解決方法。 Handling Configuration Changes With Fragments?—— from?Alex Lockwood?的blog,介紹了Configuration Changes的引發的問題、為什么不推薦適用android:configChanges方式來解決問題以及適用Fragments如何處理Configuration Changes(異步操作用的AsyncTask,比Thread+Handler在mainThread和workerThread上的UI更新和耗時處理上更加模塊化,更方便)。 Handling progress dialogs and orientation changes?from?ddewaele?的blog,主要介紹progress dialog與屏幕旋轉時產生的問題以及其解決方法,從舉例到說明非常詳細。
    How to handle screen orientation change when progress dialog and background thread active??——from stackoverflow上的問題,回答及評論值得一看。? [Android問答]旋轉屏幕導致Activity重建怎么辦?——介紹了三種解決Activity重建的方法。

    轉載于:https://www.cnblogs.com/dongweiq/p/4807591.html

    總結

    以上是生活随笔為你收集整理的Android Configuration change引发的问题及解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    丁香花中文在线免费观看 | 亚洲综合日韩在线 | 色资源中文字幕 | 天天射天天射天天射 | 九九久久电影 | 在线免费黄色毛片 | 久久久久久久免费看 | 亚洲国产小视频在线观看 | 天天操天天色天天 | 国产露脸91国语对白 | 2022久久国产露脸精品国产 | 国产香蕉视频在线播放 | 麻豆影视在线观看 | 99精品一区 | 狠狠色丁香久久婷婷综合五月 | 亚洲一区欧美激情 | www.狠狠操 | 亚洲国产片 | 中文字幕频道 | 午夜精品福利在线 | 中文字幕亚洲高清 | 在线成人性视频 | 在线视频1卡二卡三卡 | 色婷婷视频在线 | 亚洲欧美视频 | 国产最新视频在线观看 | 狠狠色香婷婷久久亚洲精品 | 国产免费xvideos视频入口 | 午夜精品久久久久久久爽 | 日日成人网 | 玖玖视频网 | 国产精品一区二区三区在线 | 久久久久久久久久免费 | 激情婷婷欧美 | 探花视频免费观看高清视频 | 91九色网站| 黄色激情网址 | 日本在线视频一区二区三区 | 国产美女免费观看 | 中文字幕在线不卡国产视频 | 国产99在线 | 国产精品美乳一区二区免费 | 香蕉影院在线播放 | 91九色网站| 国产 日韩 在线 亚洲 字幕 中文 | 欧美日韩视频一区二区三区 | 国产精品久久久久国产精品日日 | 日韩精品一二三 | 国产五月婷婷 | 精品麻豆| 中午字幕在线 | 久久久色 | 天天躁日日躁狠狠躁 | 超碰激情在线 | 天天躁日日躁狠狠躁av麻豆 | 狠狠伊人| 日韩色综合网 | 中文国产成人精品久久一 | 久久久久久久毛片 | 午夜少妇一区二区三区 | 麻豆成人精品 | 中文字幕在线视频免费播放 | 欧美激情第八页 | 日日夜夜天天射 | 天天色天天射天天操 | 久久久久久久久福利 | 国产精品久久久久久久99 | 在线观看的av网站 | 91资源在线视频 | 美女久久久久久久久久 | 国产又粗又猛又黄又爽视频 | 美女网站视频久久 | 亚洲精品在线观看免费 | 天天操天天操一操 | 中文字幕乱码亚洲精品一区 | 日本h视频在线观看 | 久久久久久久久久免费视频 | 在线观看国产一区 | 99一级片 | 亚洲精品2区 | 综合激情网... | 91成品人影院 | 国产99在线免费 | 精品视频久久久 | 亚洲 欧美日韩 国产 中文 | 激情五月婷婷综合网 | 久久久久久久久久久网 | 在线看欧美 | 免费影视大全推荐 | 成人性生交大片免费观看网站 | 青青河边草免费 | 91在线看视频免费 | 国产 视频 高清 免费 | 国产一区二区久久久久 | 福利视频一区二区 | ,午夜性刺激免费看视频 | www五月天com | 国产精品国产亚洲精品看不卡15 | 欧美日韩视频观看 | 久久草 | 麻豆91在线播放 | 人人草在线视频 | 日韩免费看 | 国产精品视频久久久 | 91九色视频国产 | 免费亚洲黄色 | 免费av看片| 久久国语露脸国产精品电影 | 日韩欧美网址 | 久草电影免费在线观看 | 激情欧美丁香 | 美女视频免费一区二区 | a黄色影院 | 亚洲精品国产综合99久久夜夜嗨 | 9ⅰ精品久久久久久久久中文字幕 | 国模视频一区二区 | 综合色站导航 | 亚洲综合狠狠干 | 免费亚洲黄色 | 欧美日本啪啪无遮挡网站 | 99热这里只有精品国产首页 | 天天艹天天干天天 | 免费高清国产 | 九九热精品在线 | 日韩理论在线视频 | 啪啪小视频网站 | 91av网址| 999国内精品永久免费视频 | 午夜电影中文字幕 | 一区二区三区四区五区在线 | 久久久免费网站 | 麻豆视频免费看 | 在线播放国产精品 | 六月丁香综合 | 精品久久国产一区 | 精品国产乱码久久久久久1区2匹 | 日韩电影黄色 | 亚洲成人第一区 | 在线观看视频三级 | 中文字幕一二三区 | 操久久免费视频 | 中文字幕av专区 | 亚洲国产精品久久久久婷婷884 | www.天天色.com | wwwwww国产| 久久久精品一区二区 | 精品一区精品二区 | 久久激情视频免费观看 | 91网址在线观看 | 黄色三级视频片 | 免费精品在线观看 | 久久精品久久久久久久 | 免费看一及片 | av夜夜操 | 99久久这里只有精品 | 亚洲国产黄色片 | 91免费高清观看 | 国产亚洲激情视频在线 | 毛片区| 青青色影院 | 久草在线久草在线2 | 亚洲日本一区二区在线 | 亚洲精品乱码久久久久久蜜桃欧美 | 国产v亚洲v | 免费99| 国产精品欧美久久久久天天影视 | 日韩激情三级 | 亚洲欧美国产精品久久久久 | 在线免费观看涩涩 | 色黄久久久久久 | 天天躁日日躁狠狠躁 | 婷婷色站 | 久久免费视频1 | 高清精品在线 | 亚洲丝袜一区 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 欧美色久 | 成人黄色av网站 | 成人蜜桃视频 | 欧美一区中文字幕 | 久久精品国产成人 | 欧美日韩国产二区三区 | 激情久久久久 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 亚洲精品乱码久久久久久蜜桃动漫 | av在线播放快速免费阴 | 午夜精品福利在线 | 国产精品一区二区三区电影 | 亚洲日本va在线观看 | 五月开心激情网 | 日韩av看片| 日日躁你夜夜躁你av蜜 | 玖玖爱免费视频 | 欧美精品久久久久久久久久丰满 | 亚洲精品国产精品国自产观看浪潮 | 一区二区高清在线 | 又黄又爽免费视频 | 最新日韩在线观看 | 亚洲a色 | 中文字幕精品一区 | 成av人电影 | 毛片1000部免费看 | 国产免费观看av | 国产精品精品久久久 | 久久综合色播五月 | 亚洲一级电影在线观看 | 国产精品 日韩 欧美 | 日日射天天射 | 99精品免费久久久久久日本 | 中文字幕在线播放日韩 | 天天看天天操 | 亚洲国产高清在线观看视频 | www99精品 | 蜜臀av.com| 麻豆视频免费在线播放 | 天天操狠狠操夜夜操 | 91福利社区在线观看 | 97国产小视频 | 国产福利在线 | 99视频国产精品 | 在线观看视频日韩 | 久久国产精彩视频 | 激情综合五月天 | 免费看一及片 | 国产群p视频 | 99r精品视频在线观看 | 免费观看午夜视频 | 免费看色网站 | 国产高清av在线播放 | 国产在线不卡视频 | 免费观看特级毛片 | 狠狠操91| av高清免费在线 | 日本精品视频在线 | 日本黄色大片免费 | 黄色精品久久久 | 久久99国产精品二区护士 | 97在线视频免费观看 | 精品999国产| 日韩av影视在线观看 | 欧美日韩视频在线播放 | 一区二区精品视频 | 99热播精品 | 久久精品影片 | 日本久久高清视频 | 精品视频成人 | 成人免费看黄 | 九草在线视频 | 天天综合导航 | 91丨九色丨丝袜 | 欧美性大胆 | a资源在线 | 日韩1页| 久久精品男人的天堂 | 欧美一级黄大片 | 在线观看一 | 久草在线精品观看 | 日韩激情第一页 | 成人av一区二区兰花在线播放 | 日av免费 | 国产九九九精品视频 | 成年人免费在线看 | 69国产盗摄一区二区三区五区 | 免费成人结看片 | 中文字幕乱码在线播放 | 国产视频一区二区三区在线 | 国产精品一区二区三区在线看 | 香蕉在线影院 | 九九九九精品 | 欧美一级爽 | 亚洲成人精品av | 久久99九九99精品 | 久久久精品 一区二区三区 国产99视频在线观看 | 国产二级视频 | 久久五月天色综合 | 九九色在线观看 | 国产亚洲久一区二区 | 天天曰天天 | 久久国产精品99国产精 | 一区二区三区免费在线观看视频 | 91视频在线观看下载 | 一区二区三区中文字幕在线 | 精品国产aⅴ麻豆 | 久草精品视频在线观看 | 五月天亚洲婷婷 | 中文字幕免费一区二区 | 天天色天天爱天天射综合 | 国产美女精彩久久 | 中文字幕一区二区三区四区在线视频 | 天天色天天色天天色 | 免费福利在线播放 | 91最新地址永久入口 | 欧美性色综合网站 | 香蕉看片| 色94色欧美 | 精品久久久久久久久久久久久 | 96久久精品 | 九九在线视频免费观看 | 1000部18岁以下禁看视频 | 亚洲黄色在线观看 | 免费久久99精品国产 | 久久国产经典视频 | 国产亚洲日本 | 成 人 黄 色 片 在线播放 | 中文字幕一区二区三区久久蜜桃 | 国产亚洲视频中文字幕视频 | 国产高清av免费在线观看 | 国内揄拍国产精品 | 韩国av免费在线观看 | 99在线看 | 中文字幕高清视频 | 久久狠狠干 | 日韩亚洲精品电影 | 亚洲一区二区黄色 | 国产你懂的在线 | 日韩欧美成人网 | 久久9999久久免费精品国产 | 99色国产 | 久久久久久久久久网 | 国产精品成人一区二区 | 成人黄色电影在线播放 | 久草在线免费看视频 | 涩涩网站在线看 | 久久久久久久久久久电影 | 色www永久免费 | 免费日韩电影 | 一区二区三区四区免费视频 | 国产精品久久久777 成人手机在线视频 | 99精品国产99久久久久久97 | 免费av大全| 91在线视频导航 | 日韩高清免费在线观看 | 国产亚洲精品久久久久久大师 | 91av大全| 久久天天躁狠狠躁亚洲综合公司 | 色窝资源 | 亚洲人片在线观看 | 久久伊99综合婷婷久久伊 | av中文电影 | 人九九精品 | 国产麻豆精品免费视频 | 99精品色 | 在线免费性生活片 | 91精品国产一区 | 黄污视频网站大全 | 日本91在线 | 国产69精品久久99的直播节目 | 91精品在线播放 | 亚洲国产欧美在线看片xxoo | 久久中文字幕导航 | 亚洲视频六区 | 日本在线观看中文字幕 | 免费国产在线精品 | 最新av电影网址 | av高清免费在线 | 国产亚洲资源 | 丁香激情综合久久伊人久久 | 丁香国产视频 | 精品免费久久久久久 | 中文字幕日韩无 | 亚洲欧洲在线视频 | 五月婷婷激情网 | 久久不射网站 | 国产亚洲精品美女久久 | 免费黄色av | 久久成人18免费网站 | 天天色成人网 | 97人人模人人爽人人喊中文字 | 精品伦理一区二区三区 | 婷婷 综合 色 | 国产精品午夜在线 | 成人一级电影在线观看 | 九色琪琪久久综合网天天 | 六月丁香婷婷网 | 久久综合色影院 | 激情综合亚洲精品 | 国产美女免费观看 | 91精品1区 | 欧美在线观看视频 | 久久avav| 国产伦精品一区二区三区无广告 | 最新黄色av网址 | 中文字幕在线视频网站 | 午夜国产成人 | 手机av资源 | 天天天天色射综合 | 九九久久影视 | 欧美色一色 | 丁香婷婷久久久综合精品国产 | 婷婷激情站 | 亚洲春色综合另类校园电影 | 91资源在线免费观看 | 日本久热 | 色综合天天综合在线视频 | 国产精品第10页 | 福利区在线观看 | 韩国av三级| 性色视频在线 | 久久久久久久精 | 国产亚洲免费的视频看 | 欧美成人69av | 国产日韩视频在线观看 | 99视频免费看 | 美女视频永久黄网站免费观看国产 | 日产乱码一二三区别在线 | 深爱激情亚洲 | 91看片黄色 | www国产一区 | 国产精品综合在线 | 波多野结衣在线观看视频 | 91视频免费看 | 99一级片| 青青草在久久免费久久免费 | 日韩1级片| 91社区国产高清 | 国产九九精品视频 | 国产又粗又猛又黄又爽视频 | 日韩午夜高清 | 天天插视频 | 欧美少妇xx | 免费网站黄 | 日产乱码一二三区别在线 | 欧美成人性网 | 久久99亚洲精品 | 五月天六月婷婷 | 中文字幕精品www乱入免费视频 | 国产一区二区不卡在线 | 六月色婷 | 亚洲高清免费在线 | 美女久久久久久久久久久 | 97在线播放 | 在线精品视频免费观看 | 97在线观看免费高清完整版在线观看 | 中文字幕观看视频 | 精品免费视频123区 午夜久久成人 | 日韩在线不卡视频 | 狠狠色综合网站久久久久久久 | 九色精品免费永久在线 | 亚洲国产午夜 | 国产亚洲精品精品精品 | 亚洲天堂激情 | 久久综合免费视频 | 色婷婷激情 | 日韩黄色在线电影 | 男女啪啪视屏 | 在线观看网站你懂的 | 日韩午夜在线观看 | 中文一区二区三区在线观看 | 四虎国产视频 | 成人国产精品电影 | 黄色特级一级片 | 中文字幕在线免费97 | 日韩在线色视频 | 国产日韩中文字幕 | 中文字幕一区二区三区久久蜜桃 | 亚洲综合色激情五月 | 亚洲最新精品 | 国产二区免费视频 | 日韩精品一区二区三区电影 | 激情欧美一区二区三区免费看 | 久久久www | 伊人中文在线 | 91精品国产亚洲 | 久操视频在线播放 | 欧美精品亚洲精品日韩精品 | 久久精品国产精品 | 精品一区91 | 五月婷婷色丁香 | 91女人18片女毛片60分钟 | 草久在线观看 | 亚洲成人av片在线观看 | 久久久久高清 | 波多野结衣在线播放一区 | 日韩中字在线观看 | 久久国产欧美日韩精品 | 97久久精品午夜一区二区 | 国产在线自| 5月丁香婷婷综合 | 久久综合给合久久狠狠色 | 午夜aaaa| 天天综合天天做天天综合 | 欧美亚洲一区二区在线 | 99久久精品免费看国产免费软件 | 五月婷婷丁香 | 在线亚洲精品 | 99r国产精品 | 久久爱资源网 | 欧美精品久久久久久久免费 | 国产精品免费久久久 | 色资源二区在线视频 | 亚洲精品网站在线 | 欧美一级黄色视屏 | 91香蕉视频好色先生 | 日韩av电影网站在线观看 | 久草视频在线观 | 婷婷成人综合 | 亚洲乱码在线观看 | 久久露脸国产精品 | 在线国产福利 | 久久在线免费视频 | 亚洲第一伊人 | 免费网站黄| 午夜影院日本 | 国产一区二区播放 | 国产一区二区三区网站 | 久久精品视频网址 | 久久8精品| 在线观看第一页 | 久久99视频精品 | 国产999精品 | 免费碰碰 | 久久歪歪 | 国产精品高潮久久av | 国产成人一区二区三区久久精品 | 在线亚洲人成电影网站色www | 四虎影视成人精品国库在线观看 | 91av视频| 国产午夜精品一区二区三区 | 天躁狠狠躁 | 亚洲精品国产免费 | 成人av在线电影 | 久久精品一区二区三区国产主播 | 欧美日韩在线精品一区二区 | 国产盗摄精品一区二区 | av在线一| 亚洲成人免费在线观看 | 精品xxx| 91探花系列在线播放 | 久久这里只有精品视频99 | 免费av在线播放 | 国产中文字幕精品 | 国产精品黑丝在线观看 | 色综合色综合久久综合频道88 | 国产黄色精品在线 | 国产手机av| 91成年人在线观看 | 成年人在线播放视频 | 综合激情 | 国产免费高清 | av色网站| 在线观看午夜 | 五月婷婷播播 | 国产中文字幕视频 | 久久一线 | 久久久国产影视 | 人人澡人人草 | 国产成人亚洲在线电影 | av成人在线播放 | 日本精品视频在线观看 | 永久中文字幕 | 在线免费观看视频一区二区三区 | 最近2019好看的中文字幕免费 | 成人毛片100免费观看 | 精品国产一区二区三区久久影院 | 成 人 a v天堂| 久久久精品影视 | 国产精品永久久久久久久久久 | 77国产精品| 免费看国产a | 国产福利久久 | 天天操天天干天天操天天干 | 在线岛国av | 96精品在线 | 九九一级片 | 在线日韩精品视频 | 黄色三几片 | 国产黄色一级片在线 | 国产成人777777 | 欧美久久久久久久久久久久 | 中文有码在线视频 | 99久久精品免费看国产四区 | 婷婷爱五月天 | 成人黄色小说在线观看 | 午夜电影一区 | 久久婷婷久久 | 国产精品综合在线 | 成人a级网站 | 国产亚洲精品久久久久久 | 国产原创av在线 | 日韩在线观看精品 | 国产成人一区二区三区电影 | 超级碰99 | 在线视频 91| 成人av资源站 | 国产一级视屏 | 亚洲成人家庭影院 | 五月激情综合婷婷 | 四虎成人免费影院 | 韩国在线一区二区 | av官网在线 | 97品白浆高清久久久久久 | 91成人短视频在线观看 | 久久成人免费视频 | 久久午夜色播影院免费高清 | 日韩在线视 | 久久成人免费视频 | 欧美精品网站 | 最近中文字幕免费大全 | 日黄网站| 欧美激情精品久久久久久免费印度 | 一区二区欧美激情 | 狠狠精品 | 免费网站观看www在线观看 | 久久久精品欧美 | 久久久久亚洲国产精品 | 日韩在线色视频 | 亚洲极色 | 18av在线视频 | 天天操夜操视频 | 曰本免费av | 在线视频一区二区 | 24小时日本在线www免费的 | 日韩一区二区三区不卡 | 日本一区二区免费在线观看 | 国产精品美女久久久免费 | 日韩美精品视频 | 五月婷婷综合在线观看 | 国产精品久久久久久久久久久久午 | 久久涩视频 | 久久久久久久久久久免费 | 国产真实精品久久二三区 | 日韩精品电影在线播放 | 久av在线| 国产精品一区二区电影 | av永久网址| 日韩精品久久久久久久电影竹菊 | 美女网色| 视频一区在线免费观看 | 国产高清在线观看av | 亚洲电影影音先锋 | 国产夫妻性生活自拍 | 日韩高清毛片 | 久草电影在线 | 91久久久久久久一区二区 | 狠狠躁18三区二区一区ai明星 | 狠狠干成人综合网 | 婷婷六月丁香激情 | 国产成人免费观看久久久 | 99热手机在线观看 | 96香蕉视频 | 日日夜夜天天干 | 人人爱人人做人人爽 | 亚洲成人高清在线 | 不卡的av在线 | 日日干夜夜操视频 | 久久久久久久久久久久亚洲 | 五月天视频网 | 婷婷视频在线观看 | 天天草综合 | 正在播放 国产精品 | 日韩黄色免费在线观看 | 国产精品99页 | 999久久国精品免费观看网站 | 高清精品视频 | 蜜桃视频在线观看一区 | 亚洲国产影院av久久久久 | 日韩网站中文字幕 | www.久久久com | 99热 精品在线 | 91精品福利在线 | 日韩一二区在线观看 | 日日夜日日干 | av成人在线播放 | 五月婷婷丁香在线观看 | 久日视频 | 香蕉视频在线网站 | 色综合久久久久久久 | 手机av永久免费 | 国产三级av在线 | 久久综合色播五月 | 国产色拍| 国产成人免费高清 | 久久久久北条麻妃免费看 | 欧美美女视频在线观看 | 69国产在线观看 | 免费看的黄色录像 | 日韩av看片 | 超级碰碰免费视频 | 伊人午夜| 精品1区2区 | 久久久久久麻豆 | av永久网址 | 天天操天天操 | 国产欧美在线一区二区三区 | 久久综合狠狠综合久久综合88 | 香蕉视频免费在线播放 | 欧美综合色 | 久久久久久久电影 | 国产视频中文字幕 | 亚洲免费观看在线视频 | 国产呻吟在线 | 天天操天天爽天天干 | 国产精品一区二区视频 | 久草在线手机观看 | av免费在线播放 | 免费三级av | 激情婷婷六月 | 国产美女视频一区 | 国产电影一区二区三区四区 | 天天操天天射天天添 | 欧美在线free | 日韩三级免费观看 | 极品嫩模被强到高潮呻吟91 | 久久久久电影 | 97在线观看 | 香蕉影视app| 久久久久久久久毛片 | 久草在线资源观看 | 五月天高清欧美mv | 91热视频 | 在线播放av网址 | 精品一区久久 | 亚洲婷婷在线 | 婷婷久操| 久久99国产精品视频 | 五月婷婷丁香六月 | 色狠狠操| 91av综合| 久久精品a| 久久免费视频精品 | 欧美日韩国产二区 | 色综合天天综合 | 六月色婷婷 | 成人免费看黄 | 亚洲综合视频在线 | 天天操天天谢 | 国产一级不卡视频 | 黄色免费电影网站 | 亚洲无吗视频在线 | 二区视频在线观看 | 在线日韩精品视频 | 欧美成人亚洲成人 | 久草在线在线精品观看 | 7777精品伊人久久久大香线蕉 | 韩国在线一区二区 | 日韩免费精品 | 国产小视频在线观看 | 91最新地址永久入口 | 天天色 天天 | 日日夜夜免费精品视频 | 制服丝袜一区二区 | 免费欧美| 狠狠操天天干 | 特级西西人体444是什么意思 | www·22com天天操| 97精品视频在线播放 | 国产成人61精品免费看片 | 欧美在线日韩在线 | 婷婷国产视频 | 久久国产精品一区二区三区四区 | 探花视频在线观看 | 久久99这里只有精品 | 亚洲va欧美va | 99精品热| av一级久久| 国产一级特黄电影 | 国产精品资源在线 | 久av电影 | 久久国产精品久久精品国产演员表 | 午夜精品久久久久久久久久久 | 美女黄频 | 日本中文字幕在线看 | 黄色大片日本 | 亚洲在线免费视频 | 精品亚洲视频在线观看 | 少妇自拍av | 久久视频这里有久久精品视频11 | 久久久www成人免费精品张筱雨 | 91精品国产三级a在线观看 | 久久天天躁夜夜躁狠狠85麻豆 | 人人插人人爱 | 在线影院中文字幕 | 国产美女久久久 | 中国一级片免费看 | 色综合久久中文字幕综合网 | 国产丝袜一区二区三区 | 国产精品美女久久久久久久 | 国内精品在线看 | 黄污视频大全 | 免费亚洲片 | av在线超碰 | 91mv.cool在线观看 | 色网站中文字幕 | 国产成人av一区二区三区在线观看 | 国产精品一区二区久久精品 | 婷婷色在线视频 | 国产一级免费视频 | 精品久久久久久久久久久久久久久久久久 | 日韩成人精品在线观看 | 日韩精品一区二区三区丰满 | 久久手机在线视频 | 中文网丁香综合网 | 精品视频99 | 人人爽人人爽人人片av | 日本不卡一区二区三区在线观看 | 日韩在线观| 免费热情视频 | 精品视频国产 | 国产中文字幕网 | 黄色一级片视频 | 成人av在线直播 | 国产手机视频精品 | 成人va视频 | bbb搡bbb爽爽爽 | 在线观看完整版免费 | 国产精品美女免费 | 欧美精品久久久久久久久久丰满 | 欧美性黑人| 亚洲高清视频在线观看 | 就要干b | 久久国产精品久久w女人spa | 久久久久久久久久久国产精品 | 日韩视频中文 | 黄色在线免费观看网址 | 8x成人在线 | 五月婷婷另类国产 | 人人爽人人看 | 国产成人精品一区二区三区福利 | 国产精品免费大片视频 | 狠狠干夜夜爱 | 色丁香婷婷 | 在线国产一区二区三区 | 久久国产午夜精品理论片最新版本 | 麻豆免费在线视频 | 玖玖在线资源 | 色狠狠一区二区 | 国产在线观看免 | 国产日韩三级 | 亚洲视频,欧洲视频 | 久久免费国产电影 | 米奇四色影视 | 亚洲区精品| 美女免费网站 | 欧洲精品亚洲精品 | 国产精品手机播放 | 国产麻豆视频 | 狠狠操.com | 日韩美在线观看 | 亚洲人成在线电影 | 国产精品一区专区欧美日韩 | 国产美女在线精品免费观看 | 午夜精品999 | 18女毛片 | 一区二区精品在线 | 国产美女在线免费观看 | 久久综合狠狠综合久久激情 | a久久久久 | 91免费版在线观看 | 在线观看aaa | 中文字幕日韩av | 在线亚洲欧美视频 | 国产成人61精品免费看片 | 成人h动漫在线看 | 丁香六月五月婷婷 | 69绿帽绿奴3pvideos | 成人黄色免费观看 | 激情在线网址 | 欧美性色19p | av女优中文字幕在线观看 | 91精品电影 | 97超碰国产精品 | 日韩在线高清免费视频 | 久草在线免费播放 | 97热在线观看 | 91精品国产自产91精品 | 免费黄在线看 | av性网站| 国产最新在线 | 亚洲精选视频免费看 | 国产成人91| 免费午夜在线视频 | 久久婷婷亚洲 | 又黄又爽免费视频 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 女人18毛片a级毛片一区二区 | 99精品国产亚洲 | 天天超碰 | 精品一区中文字幕 | 日批视频在线播放 | 国产九九精品 | 欧美一区二区三区在线观看 | 中文字幕在线观看资源 | 国产99久久九九精品 | 久久久久久国产精品美女 | 久久亚洲私人国产精品va | 国产欧美日韩视频 | 国产日韩欧美精品在线观看 | 国产精品系列在线播放 | 国产日韩三级 | 日韩精品电影在线播放 | 国产成人1区 | 97天堂| 色噜噜日韩精品欧美一区二区 | 7777精品伊人久久久大香线蕉 | 视频国产在线 | 亚洲一二区视频 | 99久久精品免费看国产麻豆 | 久久久久激情 | 精品在线免费观看 | 国产美女免费视频 | 免费合欢视频成人app | 国产在线观看地址 | 色欧美88888久久久久久影院 | 热久久精品在线 | 亚洲精品白浆高清久久久久久 | 欧美少妇xx | 久久精品99国产精品 | a天堂一码二码专区 | 天天摸天天操天天舔 | 成人黄色片在线播放 | 97国产人人| 国产a免费| 国产精品久久久久久久免费观看 | 中文字幕在线视频免费播放 | 69国产盗摄一区二区三区五区 | 日韩在线视频国产 | 日韩久久网站 | 狠狠色噜噜狠狠狠狠2022 | 一区二区三区精品在线视频 | 国产日韩欧美在线 | 婷婷 综合 色 | 全黄网站 | 国产精品综合久久久 | 黄色网www | 欧美日韩在线视频一区 | 天天射一射 | 97在线视频网站 | 中文字幕日本在线观看 | 91在线观 | 丁香在线观看完整电影视频 | 最新av网址大全 | 黄色亚洲大片免费在线观看 | 免费精品| 欧美另类一二三四区 | 欧美日韩中文在线观看 | 中文字幕精品www乱入免费视频 | 最近更新好看的中文字幕 | 久草在线一免费新视频 | 毛片a级片 | 久久亚洲成人网 | 国产成人av电影在线观看 | 国产成人不卡 | 日韩在线观看视频一区二区三区 | 久久激情综合网 | 69视频永久免费观看 | 久草在线手机视频 | 日韩av在线影视 | 久久久久久久久影视 | 亚洲一级片av | 国产在线高清精品 | 91中文字幕网 | 黄色小视频在线观看免费 | 日韩国产欧美视频 | 成人影音av| 亚洲综合成人在线 | 天天搞天天干 | av播放在线 | 久草在线视频中文 | 91麻豆精品国产91久久久久久久久 | 亚洲精品美女在线观看 | 天天操夜| 视色网站 | 五月婷婷综 | 黄色三级在线观看 | 久久久久免费看 | 国产婷婷精品 | 波多野结衣一区二区三区中文字幕 | 91麻豆精品国产91久久久使用方法 | 久久国产精品久久w女人spa | 国产精品视频久久久 | 九九精品视频在线看 | 久久人视频 | 欧美日韩aa | 日韩成人看片 | 园产精品久久久久久久7电影 | 99精品国产一区二区 | 国产精品va| 久久久国产精品人人片99精片欧美一 | 国产精品永久 | 香蕉视频91 | 国产精品成人一区二区三区 | 日本中文字幕视频 | 国产精品免费在线播放 | 色视频网站在线 | 色婷婷狠狠五月综合天色拍 | 日韩电影精品 | 国产精品理论片在线播放 | 狠狠色丁香婷婷综合最新地址 | 麻豆国产视频 | 日韩精品第1页 | 中文字幕亚洲高清 | 韩国在线一区二区 | 国产精品电影在线 | 国产精品av一区二区 | 久久99偷拍视频 | 国产精品人成电影在线观看 | 日日操天天爽 | 九九热在线免费观看 |