Activity是Android組件中最基本也是最為常見用的四大組件(Activity,Service服務,Content PRovider內容提供者,BroadcastReceiver廣播接收器)之一。
Activity是一個應用程序組件,提供一個屏幕,用戶可以用來交互為了完成某項任務。
Activity中所有操作都與用戶密切相關,是一個負責與用戶交互的組件,可以通過setContentView(View)來顯示指定控件。
在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽并處理用戶的事件做出響應。Activity之間通過Intent進行通信。
創建一個Activity,需要創建一個擴展Activity基類的java類,如:
public class MyActivity extends Activity {        @Override        protected void onCreate(Bundle savedInstanceState) {             super.onCreate(savedInstanceState);                    setContentView(R.layout.activity_main);    }}隨后,在res/layout文件夾下定義activity_main .xml文件加載此Activity的用戶界面。
還要,在清單文件AndroidManifest.xml中添加Activity信息。
常規下Activity的生命周期
正常情況下,Activity經歷的生命周期和切換過程,如下圖所示:

回調方法說明
         onCreate          表示Activity首次被創建時調用。在這個方法中,我們可以做一些初始化的工作,比如調用setContentView去加載界面布局資源、初始化Activity所需數據等。
         onStart              表示Activity正在被啟動,已經可見時調用。但是還沒有出現在前臺,還無法和用戶交互。這個時候可以理解為Activity已經顯示出來了,但是我們還看不到。
         onResume        表示Activity出現在前臺已經可見,并且可以跟用戶交互時調用,要注意這個和onStart的對比,onStart和onResume都表示Activity已經可見,但是onStart的時候Activity還在后臺,onResume的時候Activity才顯示到前臺。
         onPause            表示Activity正在暫停時調用,正常情況下,緊接著onStop就會被調用(在特殊情況下,如果這個時候快速地再回到當前Activity,那么onResume會被調用)。此時可以做一些存儲數據、停止動畫等工作,但是注意不能太耗時,因為這會影響到新Activity的顯示,onPause必須先執行完,新Activity才會執行onCreate。
         onStop               表示Activity即將停止,不再對用戶可見時調用,這時可以做一些稍微重量級的回收工作,同樣不能太耗時。
         onDestory        表示Activity即將被系統銷毀時調用,這是Activity生命周期中的最后一個回調,在這里,我們可以做一些回收工作和最終的資源釋放。
         onRestart         表示Activity正在重新啟動時調用。一般情況下,當前Activity從不可見重新變為可見狀態時,onRestart就會被調用。這種情形一般是用戶行為所導致的,比如用戶按Home鍵切換到桌面或者用戶打開了一個新的Activity,這時當前Activity就會暫停,也就是onPause和onStop被執行了,接著用戶又回到了這個Activity,就會出現這種情況。
實況說明
1、  正常一個Activity,第一次啟動時回調如下:onCreate-> onStart -> onResume。
2、  當用戶打開新的Activity或者切換到桌面時,回調如下:onPasue –> onStop。(這里有一特殊情況:如果新的Activity采用了透明主題,那么當前Activity不會回調onStop。)
3、  當用戶再次回到原Activity時,回調如下:onRestart-> onStart -> onResume。
4、  當用戶按下back鍵回退時,回調如下:onPause-> onStop -> onDestroy。
5、  當Activity被系統回收后再次打開,生命周期方法回調過程和(1)一樣,注意只是生命周期方法一樣,不代表所有過程都一樣。
6、 當從舊的Activity打開新的Activity時,兩個Activity回調如下:舊onPasue-> 新onCreate -> 新onStart -> 新onResume-> 舊onStop。
注意
從整個生命周期來說,onCreate和onDestroy是配對的,分別標識著Activity的創建和銷毀,并且只可能有一次調用。
從Activity是否可見來說,onStart和onStop是配對的。隨著用戶的操作或者設備屏幕的點亮和熄滅,這兩個方法可能被調用多次。
從Activity是否在前臺來說,onResume和onPause是配對的,隨著用戶操作或者設備屏幕的點亮和熄滅,這兩個方法可能被調用多次。
特殊情況下Activity的生命周期
情況1:資源相關的系統配置發生改變導致Activity被殺死并重新創建
比如說當前Activity處于豎屏狀態,如果突然旋轉屏幕,由于系統配置發生了改變,在默認情況下,Activity就會被銷毀并且重新創建,當然也可以阻止系統重新創建Activity。在默認情況下,不做特殊處理,Activity就會被銷毀并重新創建,其生命周期如圖:

1、  系統配置發生改變后,Activity會被銷毀,其onPasue、onStop、onDestroy均會被調用。
2、  Activity會被銷毀時,系統會在調用onStop之前調用onSaveInstanceState來保存當前Activity的狀態。(此狀態和onPause是異步的,沒有既定的時序關系,可能在之前也可能在之后被調用)
3、  Activity被重新創建后,系統會在調用onStart之后調用onRestoreInstanceState,并把銷毀時用onSaveInstanceState所保存的Bundle對象作為參數傳遞給onRestoreInstanceState和onCreate方法。(此狀態和onResume是異步的,沒有既定的時序關系,可能在之前也可能在之后被調用)
4、  onCreate正常啟動的話,其參數Bundle savedInstanceState為null。
情況2:資源內存不足導致低優先級的Activity被殺死
         此情況跟情況1完全一致。當系統內存不足時,系統就會按照Activity優先級去殺死目標Activity所在的進程,并在后續通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據。Activity按照優先級從高到低,可以分為如下三種:
         1、前臺Activity                                  正在和用戶交互的Activity,優先級最高。
         2、可見但非前臺Activity                  比如Activity中彈出一個對話框,導致Activity可見但是位于后臺無法和用戶直接交互。
         3、后臺Activity                                  已經被暫停的Activity,比如執行了onStop,優先級最低。
配置發生改變后,Activity不重新創建
為了避免系統配置發生改變后Activity重建,可以給Activity指定configChanges屬性。比如不想讓Activity在屏幕旋轉的時候重新創建來調用onCreate,就可以在AndroidManifest.xml中給configChanges屬性添加orientation這個值,如下所示: android:configChanges="orientation"
         系統中所含項目非常多,下面介紹每個項目的含義,如表所示:                  
| 項目 | 含義 | 
| mcc | SIM卡唯一標識IMSI(國際移動用戶識別碼)中的國家代碼,由三位數字組成,中國為460.此項標識mmc代碼發生了改變 | 
| mnc | SIM卡唯一標識IMSI(國際移動用戶識別碼)中的運營商代碼,由兩位數字組成,中國移動TD系統為00,中國聯通為01,中國電信為03.此項標識mnc發生改變 | 
| locale | 設備的本地位置發生了改變,一般指切換了系統語言(常用) | 
| touchscreen | 觸摸屏發生了改變,這個很費解,正常情況下無法發生,可以忽略它 | 
| keyboard | 鍵盤類型發生了改變,比如用戶使用了外插鍵盤 | 
| keyboardHidden | 鍵盤的可訪問性發生了改變,比如用戶調出了鍵盤(常用) | 
| navigation | 系統導航方式發生了改變,比如采用了軌跡球導航,這個有點費解,很難發生,可以忽略它 | 
| screenLayout | 屏幕布局發生了改變,很可能是用戶激活了另外一個顯示設備 | 
| fontScale | 系統字體縮放比例發生了改變,比如用戶選擇了一個新的字號 | 
| uiMode | 用戶界面模式發生了改變,比如用戶開啟夜間模式 | 
| orientation | 屏幕方向發生了改變,這個是最常用的,比如旋轉了手機屏幕(常用) | 
| screenSize | 當屏幕尺寸信息發生了改變,當旋轉設備屏幕時,屏幕尺寸會發生變化,這個選項比較特殊,它和編譯選項有關,當編譯選項中的minSdkVersion和targetSdkVersion均低于13時,此選項不會導致Activity重啟,否則會導致Activity重啟(API13新添加) | 
| smallestScreenSize | 設備的物理屏幕尺寸發生改變,這個項目和屏幕的方向沒有關系,僅僅表示在實際物理屏幕的尺寸改變的時候發生,比如用戶切換到了外部顯示設備,這個選項和screenSize一樣,當編譯選項中的minSdkVersion和targetSdkVersion均低于13時,此選項不會導致Activity重啟,否則會導致Activity重啟(API13新添加) | 
| layoutDirection | 當部局方向發生變化時,這個屬性用的比較少,正常情況下無須修改部局的layoutDirection屬性(API17新添加) | 
如果編譯時指定的minSdkVersion和targetSdkVersion有一個大于13,為了防止旋轉屏幕時Activity重啟,所以除了orientation外,還應該加上screenSize,如:
android:configChanges="orientation|screenSize"這樣做后,Activity沒有重新創建,并且也沒有調用onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據,取而代之的是系統調用了Activity的onConfigurationChanged方法。
新聞熱點
疑難解答