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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...