簡單介紹Android開發中的Activity控制項的基本概念_Android

來源:互聯網
上載者:User

Activity是最基本的模組,一般稱之為"活動",在應用程式中,一個Activity通常就是一個單獨的螢幕。簡單理解,Activity代表一個使用者所能看到的螢幕,主要用於處理應用程式的整體性工作,例如監聽系統事件,為使用者顯示指定的View,啟動其他Activity等。所有應用的Activity都繼承於android.app.Activity類,該類是Android提供的基層類,其他的Activity繼承該父類後,通過父類的方法來實現各種功能。

Activity 生命週期圖如下:

在android中,Activity擁有四種基本狀態:

1、Active/Runing一個新 Activity 啟動入棧後,它在螢幕最前端,處於棧的最頂端,此時它處於可見並可和使用者互動的啟用狀態。

2、Paused 當 Activity 被另一個透明或者 Dialog 樣式的 Activity 覆蓋時的狀態。此時它依然與視窗管理器保持串連,系統繼續維護其內部狀態,所以它仍然可見,但它已經失去了焦點故不可與使用者互動。

3、Stoped 當 Activity 被另外一個 Activity 覆蓋、失去焦點並不可見時處於 Stoped狀態。

4、Killed Activity 被系統殺死回收或者沒有被啟動時處於 Killed狀態。

當一個 Activity 執行個體被建立、銷毀或者啟動另外一個 Activity 時,它在這四種狀態之間進行轉換,這種轉換的發生依賴於使用者程式的動作。

如上所示,Android 程式員可以決定一個 Activity 的"生",但不能決定它的"死",也就時說程式員可以啟動一個 Activity,但是卻不能手動的"結束"一個 Activity。當你調用 Activity.finish()方法時,結果和使用者按下 BACK 鍵一樣:告訴 Activity Manager 該 Activity 執行個體完成了相應的工作,可以被"回收"。隨後 Activity Manager 啟用處於棧第二層的 Activity 並重新入棧,同時原 Activity 被壓入到棧的第二層,從 Active 狀態轉到 Paused 狀態。例如:從 Activity1 中啟動了 Activity2,則當前處於棧頂端的是 Activity2,第二層是 Activity1,當我們調用 Activity2.finish()方法時,Activity Manager 重新啟用 Activity1 併入棧,Activity2 從 Active 狀態轉換 Stoped 狀態,Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被執行,Activity2 返回的資料通過 data參數返回給 Activity1。

非使用者行為把activity不可見的時候,例如電話忽然來了==

/**  * 重新建立恢複緩衝的資料  */  @Override  protected void onRestoreInstanceState(Bundle savedInstanceState) {    Log.i("onRestoreInstanceState",savedInstanceState.getString("name"));    super.onRestoreInstanceState(savedInstanceState);  }  /**  * 被摧毀前儲存緩衝的一些資料  */  @Override  protected void onSaveInstanceState(Bundle outState) {    outState.putString("name", "簡明現代魔法");    super.onSaveInstanceState(outState);  }

在android裡,有4種activity的啟動模式,分別為:

  1.   ·standard: 標準模式,一調用startActivity()方法就會產生一個新的執行個體。
  2.   ·singleTop: 如果已經有一個執行個體位於Activity棧的頂部時,就不產生新的執行個體,而只是調用Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的執行個體。
  3.   ·singleTask: 會在一個新的task中產生這個執行個體,以後每次調用都會使用這個,不會去產生新的執行個體了。
  4.   ·singleInstance: 這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity執行個體所處的task中,只能有這個activity執行個體,不能有其他的執行個體。

  這些啟動模式可以在功能資訊清單檔AndroidManifest.xml中進行設定,中的launchMode屬性。

  相關的代碼中也有一些標誌可以使用,比如我們想只啟用一個執行個體,則可以使用 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 標誌,這個標誌表示:如果這個activity已經啟動了,就不產生新的activity,而只是把這個activity執行個體加到棧頂來就可以了。

  Intent intent = new Intent(ReorderFour.this, ReorderTwo.class);  intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);  startActivity(intent);  

  Activity的載入模式受啟動Activity的Intent對象中設定的Flag和manifest檔案中Activity的元素的特性值互動控制。

  下面是影響載入模式的一些特性

  核心的Intent Flag有:

  •   FLAG_ACTIVITY_NEW_TASK
  •   FLAG_ACTIVITY_CLEAR_TOP
  •   FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  •   FLAG_ACTIVITY_SINGLE_TOP

  核心的特性有:

  •   taskAffinity
  •   launchMode
  •   allowTaskReparenting
  •   clearTaskOnLaunch
  •   alwaysRetainTaskState
  •   finishOnTaskLaunch

  四種載入模式的區別

  所屬task的區別

  一般情況下,“standard”和”singleTop”的activity的目標task,和收到的Intent的寄件者在同一個task內,就相當於誰調用它,它就跟誰在同一個Task中。

  除非Intent包括參數FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK參數,會啟動到別的task裡。

  “singleTask”和”singleInstance” 總是把要啟動的activity作為一個task的根項目,他們不會被啟動到一個其他task裡。

  是否允許多個執行個體

  “standard”和”singleTop”可以被執行個體化多次,並且是可以存在於不同的task中;這種執行個體化時一個task可以包括一個activity的多個執行個體;

  “singleTask”和”singleInstance”則限制只產生一個執行個體,並且是task的根項目。

  singleTop 要求如果建立intent的時候棧頂已經有要建立的Activity的執行個體,則將intent發送給該執行個體,而不建立新的執行個體。

  是否允許其它activity存在於本task內

  “singleInstance”獨佔一個task,其它activity不能存在那個task裡;

  如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task裡運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。

  而另外三種模式,則可以和其它activity共存。

  是否每次都產生新執行個體

  “standard”對於每一個啟動Intent都會產生一個activity的新執行個體;

  “singleTop”的activity如果在task的棧頂的話,則不產生新的該activity的執行個體,直接使用棧頂的執行個體,否則,產生該activity的執行個體。

  比如:

  現在task棧元素為A-B-C-D(D在棧頂),這時候給D發一個啟動intent,如果D是 “standard”的,則產生D的一個新執行個體,棧變為A-B-C-D-D。

  如果D是singleTop的話,則不會生產D的新執行個體,棧狀態仍為A-B-C-D

  如果這時候給B發Intent的話,不管B的launchmode是”standard” 還是 “singleTop” ,都會產生B的新執行個體,棧狀態變為A-B-C-D-B。

  “singleInstance”是其所在棧的唯一activity,它會每次都被重用。

  “singleTask” 如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前台。 當已經存在的activity執行個體處理新的intent時候,會調用onNewIntent()方法,如果收到intent產生一個activity執行個體,那麼使用者可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,使用者不能通過按back鍵返回到這之前的狀態。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.