關於Activity的一些難點
1、前言
Activity作為Android四大元件中最重要的元件,在我們學習Android開發的時候,我們第一個元件就是學習它,Activity的具體含義就不介紹了,本文是介紹一些我們在開發中經常遇到,但是很容易忽略的點。
2、setResult()的呼叫時機
我們通過startActivityForResult從A跳轉到B,在B中我們可以通過setResult方法設定返回值,在A中我們可以通過onActivityResult接受返回值。
但是setResult方法的呼叫時機是需要注意的。setResult的呼叫需要在B的finish方法之前。我們可以先看下執行流程:
- B---setResult
- B---onPause
- A---onActivityResult
- A---onRestart
- A---onStart
- A---onResume
- B---onStop
-
B---onDestroy
當我們在B的onPause方法中,活之後執行setResult方法,那麼在A中是無法接受到值的,因此必須在B的onPause之前。也就是在B的finish之前setResult方法。
3、關於onSaveInstanceState和onRestoreInstanceState
@Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); }
關於這兩個方法我們做簡單的介紹,不細究。
當系統的配置變化,或者資源不足等等一些外界因素導致Activity被消耗並且重建,比如螢幕的旋轉。那麼onSaveInstanceState方法會被呼叫,儲存一些臨時的資料在Bundle中,比如View的一些值等等,但是這個資料大小是有限制的。當Activity被重建的時候會呼叫onRestoreInstanceState方法以及onCreate方法,把資料傳遞到Bundle savedInstanceState這個引數。我們可以獲取到一些之前儲存的資料。這樣可以做到一定的資料儲存和恢復。但是我們提到,onSaveInstanceState方法儲存的資料大小是有限制的,並且是經過序列話的資料。我們在恢復的時候通過反序列化恢復。所以這兩個方法還是有很大限制的,解決方案,我們可以使用Android Jatpack元件的ViewModel作為解決方案。之前的文章已經提到,本文就不介紹了。有興趣的同學可以去看看。
4、onConfigurationChanged方法
我們以上提到,當裝置的配置資訊改變會導致Activity被銷燬重建,而設定在AndroidManifest中配置android:configChanges則避免Activity銷燬重建,系統會回撥onConfigurationChanged方法。
舉個例子,假如我們配置了 android:configChanges="orientation|screenSize"
android:configChanges="orientation|screenSize"
orientation表示螢幕方向的變化
screenSize表示螢幕尺寸的變化
假如我們配置了這兩個引數,這樣當在Activity螢幕旋轉的時候,不會導致Activity被銷燬和重建,而是會呼叫了onConfigurationChanged,提示我們系統配置發生了變化。
5、onNewIntent方法
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); }
onNewIntent方法不是每次Activity的啟動都會被建立的,只有當Activity的啟動模式為singleTask(棧內複用)、singleInstance(單例項)、singleTop(棧頂複用)這三種啟動模式中的一種的時候,假如Activity已經被啟動,存在棧中,再次啟動A的時候,就會呼叫A的onNewIntent方法(特別注意的是,如果啟動模式是singleTop的時候,必須保證A在棧頂的情況下,onNewIntent方法才會被呼叫)。onNewIntent方法可以通過Intent獲取當前的請求資料。