Activity 的生命周期與載入模式

来源:http://www.cnblogs.com/haoxiaozhang/archive/2016/03/08/5254715.html
-Advertisement-
Play Games

當Activity 處於Android 應用中運行時,它的活動狀態由 Android 以 Activity 棧的形式管理。當前活動的Activity位於棧頂。隨著不同應用的運行,每個Activity都有可能從活動狀態轉入非活動狀態,也可能從非活動狀態轉入活動狀態。 Activity 的生命周期 歸納


  當Activity 處於Android 應用中運行時,它的活動狀態由 Android 以 Activity 棧的形式管理。當前活動的Activity位於棧頂。隨著不同應用的運行,每個Activity都有可能從活動狀態轉入非活動狀態,也可能從非活動狀態轉入活動狀態。

  Activity 的生命周期

  歸納起來 Activity 大致會經過如下4個狀態:

    1、活動狀態:當前Activity位於前臺,用戶可見,可以獲得焦點

    2、暫停狀態:其他Activity位於前臺,該Activity依然可見,只是不能獲得焦點。

    3、停止狀態:該Activity不可見,失去焦點。

    4、銷毀狀態:該Activity結束或Activity所在的Dalvlik進程被結束。

          

  從上圖中可以看出,在Activity的生命周期中,如下方法會被系統回調。

    1、onCreate(Bundle savedInstanceState):創建Activity時被回調。該方法只能被調用一次。

    2、onStart():啟動Activity時被回調。

    3、onRestart():重新啟動Activity時被回調。

    4、onResume():恢復Activity時被回調,onStart()方法後一定會回調onResume()方法。

    5、onPause():暫停Activity時被回調。

    6、onStop():停止Activity時被回調。

    7、onDestroy():銷毀Activity時被回調。該方法只會被調用一次。

  開發Activity時也可根據需要選擇性的覆蓋指定方法。其中最常見的就是覆蓋onCreate(Bundle savedInstanceState)方法,該方法用於對該Activity執行初始化。除此之位,覆蓋onPause()方法也很常見:比如用戶正在玩一個游戲,此時又電話進來,那麼我們需要將當前(游戲)暫停,並保存該游戲的進行狀態,這就可以覆蓋onPause()方法來實現。接下來當用戶再次切換到游戲狀態時,onResume()方法已經會被回調,因此可以通過重寫onResume()方法來恢復游戲狀態。

  Activity 的4種載入模式

  在AndroidManifest.XML中配置Activity時可指定android:launchMode屬性,該屬性用於配置該Activity的載入模式,該屬性支持如下4個屬性值:

    1、standard:標準模式,這是預設的載入模式

    2、singleTop:Task頂單例模式。

    3、singleTask:Task內單例模式。

    4、singleInstance:全局單例模式。

  在介紹Activity的載入模式之前,先介紹Android對Activity的管理:Android採用Task來管理多個Activity,當我們啟動一個應用時,Android就會為之創建一個Task,然會啟動這個應用的入口Activity(即<intent-filter.../>中配置為MAIN和LAUNCHER的Activity)。

  Android的Task是一個有點麻煩的概念——因為Android並沒有為Task提供API,因此開發者無法真正去訪問Task,只能調用Activity的getTaskId()方法來獲取它所在的Task的ID。事實上我們可以把Task理解成Activity棧,Task以棧的形式來管理Activity:先啟動的Activity被放在Task棧底,後啟動的Activity被放在Task棧頂。

  那麼Activity的載入模式,就負責管理實例化、載入Activity的方法、並可以控制Activity與Task之間的價值關係。

  詳細介紹這4種載入模式

  1、standard模式

    每次通過這種模式來啟動目標Activity時,Android總會為目標Activity創建一個新的實例,並將該Activity添加到當前的Task棧中——這種模式不會啟動新的Task,新Activity將被添加到原有的Task中。

  2、singleTop模式

    這種模式與 standard 模式基本相似,但有一點不同:當將要被啟動的目標Activity已經位於Task棧頂時,系統不會重新創建目標Activity的實例,而是直接服用已有的Activity實例。

  3、singleTask模式

    採用赭紅載入模式的Activity在用一個Task內只有一個實例,當系統採用singleTask模式啟動目標Activity時,可分為如下三種情況:

      3.1、如果將要啟動的目標Activity不存在,系統將會創建目標Activity的實例,並將它加入Task棧頂。

      3.2、如果將要啟動的目標Activity已經位於Task棧頂,此時與singleTop模式的行為相同。

      3.3、如果將要啟動的目標Activity已經存在,但沒有位於Task棧頂,系統將會把位於該Activity上面的所有Activity移除Task棧,從而使得目標Activity轉入棧頂。

  4、singleInstance模式

    這種載入模式下,系統保證無論從那個Task中啟動目標Activity,只會創建一個目標Activity實例,並會使用一個全新的Task棧來裝載該Activity實例。

    當系統採用singleInstance模式啟動目標Activity時,可分為如下兩種情況:

      4.1、如果將要啟動的目標Activity不存在,系統會先創建一個全新的Task、再創建模板Activity的實例,並將它加入新的Task的棧頂。

      4.2、如果將要啟動的目標Activity已經存在,無論它位於哪個應用程式中,無論它位於哪個Task中,系統將會把該Activity所在的Task轉到前臺,從而使用該Activity顯示出來。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在很多現實的場景中,有的文本框我們希望在選擇“是”的按鈕之後才出現,這就需要js控制TR的隱藏和顯示,如何控制,本文為大家揭曉 下文分享的一段代碼:選擇是的按鈕就顯示身高和體重的文本框的代碼。註意:ready方法必須要引用jquery的庫。 1.html Code <html> <head> <me
  • 看到網上很多展示html5雪花飛動的效果,確實非常引人入勝,我相信大家也跟我一樣看著心動的同時,也很好奇,想研究下代碼如何實現;雖然哦很多地方也能下載這些源碼,不過也不知道別人製作此類動畫時的思路及難點分析。 我這幾天剛好學習了一下,也趁著此刻有時間從需求分析、知識點、程式編寫一步步給大家解剖下。
  • 1. css屬性命名區分大小寫嗎? 不區分,不過一般小寫,便於理解 2. margin-top和margin-bottom對於行內(內斂inline)元素效果一樣麽? 3.padding-top和padding-bottom對於inline元素都會增加元素本身的大小麽? 回答2,3,需要瞭解html...
  • 我們知道任何一個自定義函數都是Function構造器的實例,所以我們可以通過new Function的方式來創建函數,使用語法很簡單, new Function(形參1, 形參2, ..., 形參N, 函數體) 註意,裡面的參數全部是以字元串的形式呈現。比如一個簡單的例子——要求寫一個函數, 求兩個
  • ShineJaie 原創,轉載請註明出處。 昨晚在一個交流群里看到有位網友提了一個他的面試題求助答疑。剛好我也有看到,就對這個問題思考了一下,覺得這道題對理解 JavaScript 作用域還是很有幫助的,特此又把自己的解題思路梳理了一遍,希望對其它人有所幫助。 首先看下麵試題: 1 var arr
  • jQuery 2 的版本與jQuery 1的版本相比,沒有再考慮IE6,7,8的相容問題,因此使用時如果不用考慮IE6,7,8就用jQuery 2的版本,如果需要考慮IE6,7,8就使用jQuery 1的版本。 jQuery對象是一個以DOM為對象的特殊數組,並包含大量方法,簡單可以理解為: fun...
  • 作者: "@gzdaijie" 本文為作者原創,轉載請註明出處:http://www.cnblogs.com/gzdaijie/p/5255084.html 目錄 1.Activity生命周期 1.1 Activity生命周期簡介與測試 1.2 設備旋轉時的生命周期與數據恢復 1.3 Activit
  • EventBus是一個Android上用的消息分發的類庫,非常靈活好用,主要的原理是利用了反射註冊以及調用. 本文是在閱讀EventBus的源碼過程中所記錄的東西, 遇到不懂的去查了,然後留下了鏈接. 有點流水賬,講得也不是很深入,如果有錯請幫忙指正.
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...