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

首頁 > 系統 > Android > 正文

Activity生命周期與啟動模式圖文解說

2019-12-12 01:37:41
字體:
來源:轉載
供稿:網友

Activity作為Android開發中最常用的一個組件,是Android開發人員必須熟悉且掌握的重要內容。同時Activity也是在面試中經常被問到的一個方向。因此,掌握Activity的重要性也不言而喻。希望能夠對Activity有一個較為全面的介紹。如果在閱讀過程中發現講述的內容中有什么疏忽沒有記錄下來或者是錯誤的地方的話,歡迎在下方留言指出。下面開始進入正題吧:

預備知識:任務棧/回退棧**

棧是一種常見的數據結構,具有先進后出,后進先出的特點。從數據形式上來說,它可以用下面這一張圖來表示:

在這個棧中,我們每一個新放進棧的數據,都會放在棧頭的位置,而其他的在之前如果已經放進來的數據,則會被逐漸按順序往棧底下面移動,看起來就像是前面先被進來的數據被后面新放進來的數據往棧底下面壓一樣。這種情況叫做壓棧。就好像一把手槍的彈夾,當我們把里面裝子彈的時候,后面放進去的子彈會被逐漸往底部擠壓下去。而當我們需要取出數據時,因為棧就規定了一個進出口,就是棧頭(也叫棧頂),所以我們取出數據的時候,也是要按照數據進來的順序,從棧頂開始取出,每取出一個順序,棧中的其他數據就會忘上移,直到最后一個數據從棧頂被取出而結束。這種情況叫做彈棧。而如果我們不想要其他的數據,值需要棧中倒數第二個數據的話,那也沒辦法,只能把這個數據前面的數據全部彈出棧,你才能取到這個數據。否則的話一切皆是免談。而在Android的設計中,是使用棧這種數據結構來存放Activity的,它有一個名字,叫做任務棧,也叫回退棧。關于棧的知識,到這里已經基本可以用來介紹Activity了,至于其他方面的內容,可參考其他博客或書籍。這里推薦的是:程杰的《大話數據結構》一書。

什么是Activity:

Activity生命周期經典圖解:

Activity,中文“活動”。在任大神的書中,把它理解成界面。實際上我非常同意這種說法,因為Activity實際上就是我們在應用中展現出來的一個個用戶界面,它會加載指定的布局文件來顯示各種UI元素,并為這些元素設置事件處理函數,從而實現用戶與應用的交互。比如我們打開一個手機App時,展現出來的登錄界面、注冊界面、主界面等,都是一個個不同的Activity。它是用戶可以直接在App上用肉眼看得到的界面操作,以及針對用戶對App的某些特定操作而進行的事件處理(這個是用戶不可見的)。

Activity的組成:

在上面對Activity的介紹中,用以作為用戶可見的部分顯示的是一份.xml格式的布局文件,而用以布置事件處理函數的則是一個Activity對象。那么為什么我們把肉眼可見的部分也叫作Activity呢?因為我們可以直接在Activity中對布局文件進行操作,等于布局文件是Activity對象的一個外延,但多數情況下,我們使用Activity的方式依舊為Activity對象+xml布局文件。不過,關于Activity的組成,卻并沒有那么簡單。實際上,一個完整的Activity組成并沒有那么簡單,在Activity與開發人員可以設置的視圖,也就是對用戶界面進行布局的范圍之上,還包括了其他層次的封裝。如圖:

我們可以看到,在Activity之下有一個PhoneWindow,這個PhoneWindow實際上是一個叫做Window的類的實現類。說起Window,相信有人試過在取消Activity自帶的標題欄的時候,調用了這么一個方法:

//取消系統自帶的標題欄requestWindowFeature(Window.FEATURE_NO_TITLE);

而這個方法的具體模樣,是這樣的:

 public final boolean requestWindowFeature(int featureId) {    return getWindow().requestFeature(featureId);  }

我們發現,它實際回調了一個getWindow().requestFeature(featureId)方法,而這個getWindow()返回的實際上就是一個Window類型的對象mWindow:

public Window getWindow() {    return mWindow;  }

那么,當我們查看這個Window源碼的時候,發現它其實是抽象類

public abstract class Window {  /** Flag for the "options panel" feature. This is enabled by default. */  public static final int FEATURE_OPTIONS_PANEL = 0;  /** Flag for the "no title" feature, turning off the title at the top   * of the screen. */  public static final int FEATURE_NO_TITLE = 1;  /** Flag for the progress indicator feature */  public static final int FEATURE_PROGRESS = 2;  /** Flag for having an icon on the left side of the title bar */  .....}

我們知道,抽象類要想發揮作用,那么需要有一個子類去繼承抽象類,而PhoneWinsow這是這么一個實現類。我們所執行的去除標題欄的操作,實際上調用的也是這個PhoneWindow中的方法而已。這也從側面反映出我們前面所說的,Activity的組成不僅僅是一個Activity對象+xml布局文件那么簡單。盡管我們常見的模式就是這樣,但實際上這已經是經過封裝之后才展現出來的。

Activity的創建、激活與銷毀

創建Activity

要在代碼中創建一個Activity,需要經過一下幾個步驟:
1.新建一個類,繼承自android.app.Activity.類的命名建議為:xxxActivity樣式,比如LoginActivity
2.在AndroidManifest.xml文件中的 < application>節點下使用新的< activity>節點注冊該Activity,同時為< activity>節點配置android:name屬性.取值為Activity類的包名和類名,推薦為每一個< activity>節點配置android:label屬性。例如:

<activity   android:name=".LoginActivity"   android:label="@string/title_activity_login" > </activity>

注意:如果存在多個Activity,那么各< activity>節點不區分先后順序。如果要調整第一個進入軟件顯示界面的Activity,那么則需在該< activity>節點中配置以下信息:

<intent-filter>    <action android:name="android.intent.action.MAIN" />    <category android:name="android.intent.category.LAUNCHER" />      </intent-filter>

3.如果需要在Activity中加入xml布局文件,則需要在res/layout目錄下創建并設計布局,命名建議為activity_xxx(與xxxActivity匹配),如activity_login。
4.設計完布局文件之后,在Activity類中重寫onCreate()方法,并在該方法中通過調用setContentView()方法加載布局。比如:

protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    requestWindowFeature(Window.FEATURE_NO_TITLE);    setContentView(R.layout.activity_registe  }

以上為手動創建Activity的方式,當然我們也可以使用IDE幫助實現。以Eclipse為例:
1.快捷鍵:ztrl+N。彈出窗口如下:

選擇Android目錄下-> Android Activity ,點擊Next,效果如下:

選擇樣式,這里選擇默認樣式Black Activity。點擊next,效果如下:

在這里,更改Activity Name欄目,下面Layout欄目也會發生自動變化,點擊finish。創建成功。

激活Activity

我們創建了Activity之后,除非把它設置為默認界面,否則都需要被激活才可使用。調用Activity類定義的startActivity(Intent)方法,即可激活新的Activity,其中:參數Intent對象可以直接通過Intent類的構造方法來創建
在使用Intent類的構造方法時,指定2個參數,第1個參數是Context對象
第2個參數是被激活的Activity類,例如SecondActivity.class。例子如下:

//跳轉到另一個ActivitystartActivity(new Intent(this,SecondActivity.class));

如此,便實現了激活SecondActivity并跳轉至SecondActivity界面的操作

上面是激活Activity的第一種方法,而如果你需要在激活第二個Activity后對其設置,并且在該Activity執行finish之后返回數據給第一個Activity的時候,可以用startActivityForResult()方法。用法如下:

Intent mIntent =new Intent(this,SecondActivity.class);int requestCode = 0;startActivityForResult(mIntent,requestCode)

同時,在第一個Activity重寫數據返回的處理辦法onActivityResult();用法如下:

protected void onActivityResult(int requestCode, int resultCode, Intent data) { }

注意:requestCode可以隨便設置,但必須大于或等于0

銷毀Activity

調用Activity類定義的finish()方法即可銷毀當前Activity。

Activity的生命周期分析:

典型情況下的生命周期分析

在正常情況下。Activity會經歷以下生命周期,每個生命周期都執行著一個聲明周期方法:

1.onCreate():在我們前面的手動創建Activity的例子中便已經接觸到這個方法,它是Activity生命周期執行的第一個生命周期方法,表示的是Activity正在被創建,在這個生命周期方法里我們可以執行一些初始化的工作。比如加載xml布局文件,初始化元素控件以及加載相應的數據或者設置監聽器等。

2.onStart():表示Activity正在啟動,并且逐漸從不可見到可見直到Activity展示到前臺

3.onRestart():表示Activity正在重啟。一般情況下,當當前的Activity由不可見狀態重新恢復為可見狀態的過程中,就會調用這個方法。

4.onResume():在Activity徹底展示在前臺(完全可見)的時候被調用,在執行完這個方法后,Activity會請求ActivityManagerService(下稱AMS)對它管理的視圖進行渲染,此時的Activity位于棧頂且保持運行狀態

5.onPause():該方法在Activity由可見狀態逐漸變為不可見的狀態的過程中調用。一般在系統準備去啟動或者恢復另一個Activity的時候調用。這時可做一些數據存儲、停止動畫或者釋放一些消耗的CPU資源等操作,但注意不要做耗時操作。否則會造成卡頓現象或者ActiviNotResponding異常(ANR)。

6.onStop():表示Activity處于停止,即完全不可見狀態。

7.onDestory():在Activity被徹底銷毀之前調用,表示著Activity被徹底移出了任務棧。是Activity的最后一個聲明周期方法。

關于Activity的生命周期,網上找了一張非常明了的示意圖:

在這里作兩點補充關于從onPause()

主站蜘蛛池模板: 伊春市| 嘉义市| 普陀区| 罗山县| 高唐县| 乐安县| 盐池县| 姜堰市| 六盘水市| 潍坊市| 当阳市| 东乡族自治县| 昆明市| 梧州市| 闸北区| 营山县| 曲阜市| 福州市| 三河市| 醴陵市| 繁昌县| 金阳县| 会昌县| 巴塘县| 崇文区| 连城县| 沙田区| SHOW| 沧源| 岱山县| 博爱县| 昌乐县| 太谷县| 石河子市| 衡水市| 邯郸县| 青州市| 安徽省| 青州市| 厦门市| 娄烦县|