A. 當android旋轉屏幕導致橫豎屏切換時,如何保存當前Fragment的實例
總結了以下幾種情況:
設備旋轉時保存Activity的交互狀態: onSaveInstanceState();
設備旋轉時保存Fragment的交互狀態: setRetainInstance(true);
設備旋轉時保存WebView的數據:
android:configChanges="keyboardHidden|orientation|screenSize";
設備旋轉時保存在自定義View中繪制的圖形。
如果Fragment不包含WebView,只是簡單的UI View,像是TextView, Button, CheckBox, ImageView... 不建議使用setRetainInstance方法,只需要記住當前fragment的index,然後在設備旋轉後根據數據重新實例化一個fragment。因為不包含大量數據,旋轉的過程中幾乎可以用「無縫切換」來形容。
如果包含WebView還是採用針對WebView的方法(題主的情況)。所以要看情況而定。
B. android怎樣用token維持原登錄狀態
1.首次登錄的時候,讓服務端傳會token給你,然後你把token保存。
2.下次在進入首頁界面之前,通過介面把保存的token上傳給服務端。
3.如果服務端驗證token成功,直接進入首頁,否則進入登錄頁。
C. Android Activity啟動模式與狀態保存及恢復詳解
Activity是 Android組件 中最基本也是最為常見用的四大組件(Activity,Service服務,Content Provider內容提供者,BroadcastReceiver廣播接收器)之一 。
Activity是一個應用程序 組件 ,提供一個 屏幕 ,用戶可以用來交互為了完成某項任務。
Activity中所有操作都與用戶密切相關,是一個負責與 用戶交互 的組件,可以通過setContentView(View)來 顯示指定控制項 。
在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控制項也可以監聽並處理用戶的事件做出響應。Activity之間通過Intent進行通信。
關於Activity啟動流程請參考之前的文章 Android activity啟動流程分析
activity有四種啟動模式,分別為standard,singleTop,singleTask,singleInstance。如果要使用這四種啟動模式,必須在manifest文件中<activity>標簽中的launchMode屬性中配置。
標準的默認啟動模式,這種模式下activity可以被多次實例化,即在一個task中可以存在多個activity,每一個activity會處理一個intent對象,(在A中再次啟動A,會存在後面的A在前面的A上面,當前task會存在兩個activity的實例對象)
如果一個singleTop模式啟動的activity實例已經存在於棧頂,那麼再次啟動這個activity的時候,不會重新創建實例,而是重用位於棧頂的那個實例,並且會調用實例的onNewIntent()方法將Intent對象傳遞到這個實例中,如果實例不位於棧頂,會創建新的實例。
啟動模式設置為singleTask,framework在啟動該activity時只會把它標示為可在一個新任務中啟動,至於是否在一個新任務中啟動,還要受其他條件的限制,即taskAffinity屬性。
taskAffinity :默認情況下,一個應用中的所有activity具有相同的taskAffinity,即應用程序的包名。我們可以通過設置不同的taskAffinity屬性給應用中的activity分組,也可以把不同的應用中的activity的taskAffinity設置成相同的值,當兩個不同應用中的activity設置成相同的taskAffinity時,則兩個activity會屬於同一個TaskRecord。
在啟動一個singleTask的Activity實例時,如果系統中已經存在這樣一個實例,就會將這個實例調度到任務棧的棧頂,並清除它當前所在任務中位於它上面的所有的activity;如果這個已存在的任務中不存在一個要啟動的Activity的實例,則在這個任務的頂端啟動一個實例;若這個任務不存在,則會啟動一個新的任務,在這個新的任務中啟動這個singleTask模式的Activity的一個實例。
以singleInstance模式啟動的Activity具有全局唯一性,即整個系統中只會存在一個這樣的實例,如果在啟動這樣的Activiyt時,已經存在了一個實例,那麼會把它所在的任務調度到前台,重用這個實例。
以singleInstance模式啟動的Activity具有獨占性,即它會獨自佔用一個任務,被他開啟的任何activity都會運行在其他任務中(官方文檔上的描述為,singleInstance模式的Activity不允許其他Activity和它共存在一個任務中)。
被singleInstance模式的Activity開啟的其他activity,能夠開啟一個新任務,但不一定開啟新的任務,也可能在已有的一個任務中開啟,受條件的限制,這個條件是:當前系統中是不是已經有了一個activity B的taskAffinity屬性指定的任務。
涉及到Activity啟動,就不得不說一下Activity的管理,Activity是以什麼方式及被什麼類來進行管理的,涉及的類主要如下:
歷史棧中的一個條目,代表一個activity。ActivityRecord中的成員變數task表示其所在的TaskRecord,ActivityRecord與TaskRecord建立了聯系。
內部維護一個 ArrayList<ActivityRecord> 用來保存ActivityRecord,TaskRecord中的mStack表示其所在的ActivityStack,TaskRecord與ActivityStack建立了聯系。
內部維護了一個 ArrayList<TaskRecord> ,用來管理TaskRecord,ActivityStack中持有ActivityStackSupervisor對象,由ActivityStackSupervisor創建。
負責所有ActivityStack的管理。內部管理了mHomeStack、mFocusedStack和mLastFocusedStack三個Activity棧。其中,mHomeStack管理的是Launcher相關的Activity棧;mFocusedStack管理的是當前顯示在前台Activity的Activity棧;mLastFocusedStack管理的是上一次顯示在前台Activity的Activity棧。
ActivityThread 運行在UI線程(主線程),App的真正入口。
用來實現AMS和ActivityThread之間的交互。
負責調用Activity和Application生命周期。
當一個Activity未被主動關閉,即「被動關閉」時,可能需要系統給用戶提供保持一些狀態的入口。
前面說的入口就是:Activity提供了onSaveInstanceState()方法,該方法是Activity在關閉前保存狀態的核心方法。
前面提到「被動關閉」,如果是主動關閉那麼就不會調用,比如:按back鍵、調用finish()等,那麼"被動關閉"的場景有哪些呢?下面給列舉一下:
肯定在調用onStop()前被調用,但不保證在onPause()前 / 後,一般是在onPause()後調用。
當需要保持狀態時,在onSaveInstanceState()內執行以下邏輯:
當需要恢復時,在onCreate()內部執行以下邏輯:
布局每個View默認實現:onSaveInstanceState(),即UI的任何改變都會自動的存儲和在activity重新創建的時候自動的恢復(只有在為該UI提供了唯一ID後才起作用);
若需復寫該方法從而存儲額外的狀態信息時,應先調用父類的onSaveInstanceState()(因為默認的onSaveInstanceState()幫助UI存儲它的狀態);
只使用該方法記錄Activity的瞬間狀態(UI的狀態),而不是去存儲持久化數據,因為onSaveInstanceState()調用時機不確定性;可使用 onPause()[一定會執行]存儲持久化數據;
Activity提供了onRestoreInstanceState()方法,該方法是Activity在重新創建後恢復之前保存狀態的核心方法。
若被動關閉了Activity,即調用了onSaveInstanceState(),那麼下次啟動時會調用onRestoreInstanceState()。
onCreate()--->onStart()--->onRestoreInstanceState()--->onResume()
注意: onSaveInstanceState()、onRestoreInstanceState()不一定 成對被調用
如:當正在顯示Activity A時,用戶按下HOME鍵回到主界面,然後用戶緊接著又返回到Activity A,此時Activity A一般不會因為內存的原因被系統銷毀,故Activity A的onRestoreInstanceState()不會被執行;
針對以上情況,onSaveInstanceState保持的參數可以選擇在onCreate()內部進行解析使用,因為onSaveInstanceState的bundle參數會傳遞到onCreate方法中,可選擇在onCreate()中做數據還原。
至此:Activity的啟動模式及Activity的狀態保持及恢復介紹完畢。
D. Android登錄後的用戶數據如何保存,Android如何保存數據
給個例子:
保存用戶信息森皮
讀取用戶信息
Application Class,SharedPreferences和SQLite Database
當需要保存APP啟動後的周期信息時,如(var , array , list , objects)使用Class實例保存。
當需要保存少量信息,或者永遠保存信息(APP只要安裝在設備此行差上),或者每帶雀次啟動APP時需要使用的信息。
當有大量諸如表哥格式的信息需要記錄時,可以使用SQLite Database來保存