Activity隨筆

来源:http://www.cnblogs.com/knabe/archive/2017/10/13/7661170.html
-Advertisement-
Play Games

Activity的生命周期 1.正常情況下的生命周期 Activity的生命周期切換過程 關於onStart和onResume、onPause和onStop的不同,onStart和onStop是從Activity是否可見這個角度來回調,onResume和onPause是從Activity是否位於前臺 ...


Activity的生命周期 

1.正常情況下的生命周期

  1. onCreate:  Activity正在被創建,生命周期中的第一個方法,常在此方法中做一些初始化工作,比如調用setContentView方法,初始化Activity所需數據等。
  2. onRestart:  表示Activity正在重新啟動。一般情況下,當Acivity從不可見重新變為可見狀態時,onRestart方法就會被調用。
  3. onStart:  表示Activity正在被啟動,這是Activity已經可見,但是沒有出現在前臺,還無法與用戶交互。
  4. onResume:  表示Activity可見並出現在前臺開始活動。onStart和onResume都表示Activity可見,但是onStart的時候Activity還在後臺,onResume時Activity才顯示到前臺。
  5. onPause:  Activity正在停止,此時可以做一些存儲數據、停止動畫等工作。但註意不能太耗時,因為會影響到新Activity的顯示,onPause必須先執行完,新Activity的onResume才能執行。
  6. onStop:  Activity即將停止,可以做一些稍微重量級的回收工作,同樣不能太耗時。
  7. onDestory:  Activity即將被銷毀,在這裡,做一些回收工作和資源的釋放。

      

Activity的生命周期切換過程

  關於onStart和onResume、onPause和onStop的不同,onStart和onStop是從Activity是否可見這個角度來回調,onResume和onPause是從Activity是否位於前臺這個角度來回調的,除了這種區別,在實際使用中沒有其他明顯的區別。

2.異常情況下的生命周期分析

  資源相關的系統配置發生改變導致Activity被殺死並重新創建

  

                                   異常情況下Activity的重建過程

  當手機旋轉屏幕時,系統配置方式發生邊,在預設情況下Activity就會被銷毀並且重新創建。當系統配置發生改變後,Activity會被銷毀,其onPause、onStop、onDestory均會被調用,同時由於Activity是在異常情況下終止的,系統會調用onSaveInstanceState來保存當前Activity的狀態(正常情況下系統不會調用這個方法)。這個方法調用時機在onStop之前,和onPause沒有時序關係(可能在onPause之前也可能之後)。當Activity被重新創建之後,系統會調用onRestoreInstanceState,並且把Activity銷毀時onSaveInstanceState保存的bundle傳給onRestoreInstanceState和onCreate方法。可以通過bundle是否為空來判斷Activity是否被重建了。如果被重建了,可以取出之前保存的數據並恢復,從時序上來講,onRestoreInstanceState的調用時機在onStart之後。一般情況下,旋轉屏幕後Activity會重新創建。但是當設置Activity的configChanges屬性為orientation|screenSize之後Activity不會重新創建。

3.Activity的啟動模式LaunchMode

  1. standard(標準模式):  也是系統的預設模式,每次啟動一個Activity都會重新創建一個新的實例,不管這個實例是否已經存在。onCreate、onStart、onResume都會被調用。
  2. singleTop(棧頂復用模式)  在這種模式下,如果新Activity的實例已經位於任務棧的棧頂,那麼此Activity不會被重新創建,同時回調它的onNewIntent方法,通過此方法的參數我們可以去除當前請求的信息。需要註意,這個Activity的onCreate、onStart方法不會被重新調用。如果新Activity的實例已經存在但不是位於棧頂,那麼新Activity仍然會重新創建。
  3. singleTask(棧內復用模式)  這是一種單例模式,在這種模式下,只要Activity在一個棧中存在,那麼多次啟動此Activity都不會重新創建實例,和singleTop一樣,系統也會回調其onNewIntent方法。如果棧中有這個實例,那麼會將該實例之上的Activity全部彈出棧,將該實例置於棧頂。
  4. singleInstance(單實例模式)  這是一種加強的singleTask模式,除了具有singleTask模式的所有特性之外,還加強了一點,就是具有此模式的Activity只能單獨的位於一個任務棧中。

4.Activity的Flags

  FLAG_ACTIVITY_NEW_TASK

  這個標記位的作用是為Activity指定“singleTask”啟動模式,其效果和在XML中指定該模式相同。

  FLAG_ACTIVITY_SINGLE_TOP

  這個標記位的作用是為Activity指定“singleTop”啟動模式,其效果和在XML中指定該模式相同。

  FLAG_ACTIVITY_CLEAR_TOP

  具有此標記位的Activity,當它啟動時,在同一個任務棧中所有位於它上面的Activity都要出棧。

5.IntentFilter的匹配規則

  隱式調用需要Intent能夠匹配目標組件的IntentFilter中所設置的過濾信息,如果不匹配將無法啟動目標Activity。IntentFilter中的過濾信息有action、category、data。一個Intent只有同時匹配action類別、category類別、data類別才算完全匹配。另外,一個Activity中可以有多個intent-filter,一個Intent只要能匹配任何一組intent-filter即可成功啟動對應的Activity。

  1.action的匹配規則

  action是一個字元串,系統預定義了一些action,我們也可以在應用中定義自己的action。action的匹配要求Intent中的action存在且必須和過濾規則中的其中一個action相同,這裡需要註意和category匹配規則的不同。action區分大小寫,大小寫不同字元串相同的action會匹配失敗。

  2.category的匹配規則

  Intent中如果有category,那麼所有的category都必須和過濾規則中的其中一個category相同。當然,Intent中可以沒有category,但它仍然可以匹配成功,原因是系統在調用startActivity和startActivityForResult的時候會預設為Intent加上“android.intent.category.DEFAULT”這個category。同時為了我們的activity能夠接收隱式調用,就必須在intent-filter中指定“android.intent.category.DEFAULT”這個category。

  3.data的匹配規則

  data由兩部分組成,mimeType和URI。mimeType指媒體類型,比如image/jpeg、audio/mpeg4-generic和video/*等,而URI中包含的數據就比較多了。下麵是URI的結構:

    <scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

  Scheme:  URI的模式,比如http、file、content等,如果URI中沒有指定scheme,那麼整個URI是無效的。

  Host:  URI的主機名,比如www.biadu.com

  Port:  URI中的埠號

  Path、pathPattern和pathPrefix:  這三個參數表述路徑信息,其中path表示完整的路徑;pathPattern也表示完整的路徑信息,但是它裡面可以包含通配符;pathPrefix表示路徑的首碼信息。

  最後,當我們通過隱式方式啟動一個Activity的時候,可以做一下判斷,看是否有Activity能夠匹配我們的隱式Intent。判斷方法有兩種:採用PackageManager的resolveActivity方法或者Intent的resolveActivity方法如果找不到匹配的Activity就會返回null。

 

參考自《Android開發藝術探索》


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

-Advertisement-
Play Games
更多相關文章
  • 最近寫了點小東西一個滑動驗證 ...
  • JS中常用的內置函數如下: 1、eval(str):計算表達式的結果。 2、parseInt(str,n):將符串轉換成整數數字形式(可指定幾進位)。 3、parseFloat(str):將字元串轉換成符點數字形式。 4、isNaN(): 測試是(true)否(false)不是一個數字。 5、isF ...
  • 隔行變色功能,不用js,直接用css偽類就可以做,這個實例可以作為js插件開發很好的入門級實例。本文實現的隔行變色包括以下功能: 1,支持2種常用結構共存( div元素 和 表格類型 ) 2,一個頁面內支持不同模塊隔行變色,分別管理 3,可以定製的配置有: 奇/偶數行的背景顏色 特定的模塊加上隔行變 ...
  • template.js插件在表格渲染方面還是極其出色的,當數據在非同步載入後不用使用傳統的方式,在ajax裡面拼接html語句載入表格,直接用這個插件將ajax傳回來的json數組直接渲染在前端中,省下了不少時間。 我使用template.js主要是滿足項目實現為目的,不是深入探究,總結一下我在項目里 ...
  • ``` <!doctype html vue route demo Hello App! <! 使用 router link 組件來導航. <! 通過傳入 屬性指定鏈接. <! <router link 預設會被渲染成一個 標簽 Go to Foo Go to Bar <! 路由出口 <! 路由匹配 ...
  • //除法函數,用來得到精確的除法結果//說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為精確的除法結果。//調用:accDiv(arg1,arg2)//返回值:arg1除以arg2的精確結果function accDiv(arg1,arg2){ var ...
  • 這是我學習nodejs以來做的第一個小例子,很簡單,就是在第一個頁面里輸入自己的名字,在第二個頁面(有圖片)中顯示。思路和很多地方都參考了http://www.cnblogs.com/giggle/p/6287931.html 這篇文章,感謝作者。 這篇文章中說得不對的地方希望大家指正。 ...
  • 一:文件傳輸 在android開發中,有時候需要將文件從pc端傳遞至android,或者將軟體運行的日誌,從android設備傳遞到pc進行分析,我們可以使用windows的cmd視窗,或者android studio的terminal視窗來傳遞文件。 1:連接android設備 此處預設是andr ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...