国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Activity和Activity的生命周期

2019-11-09 17:11:31
字體:
來源:轉載
供稿:網友

Activity是什么

Activity是Android組件中最基本也是最為常見用的四大組件(Activity,Service服務,Content PRovider內容提供者,BroadcastReceiver廣播接收器)之一。

Activity是一個應用程序組件,提供一個屏幕,用戶可以用來交互為了完成某項任務。

Activity中所有操作都與用戶密切相關,是一個負責與用戶交互的組件,可以通過setContentView(View)來顯示指定控件。

在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽并處理用戶的事件做出響應。Activity之間通過Intent進行通信。

創建Activity

創建一個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沒有重新創建,并且也沒有調用onSaveInstanceStateonRestoreInstanceState來存儲和恢復數據,取而代之的是系統調用了Activity的onConfigurationChanged方法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 西藏| 沧源| 开原市| 无棣县| 都江堰市| 洪泽县| 南涧| 搜索| 万源市| 岑溪市| 黄浦区| 金湖县| 保靖县| 巩留县| 乐至县| 丽水市| 拉萨市| 城固县| 浪卡子县| 西乌| 崇仁县| 获嘉县| 凭祥市| 正定县| 固阳县| 海城市| 柘荣县| 边坝县| 府谷县| 将乐县| 克拉玛依市| 鹤庆县| 贡觉县| 横峰县| 临高县| 津南区| 宝鸡市| 东安县| 前郭尔| 罗城| 南开区|