Android四大組件(Activity)

四大組件分別是:Activity、Service、ContentProvider、BroadcastReceiver

1. Activity

作用:界面顯示,與用戶交互

一個Activity為一個單獨的界面(窗口)
Activity之間通過Intent通信
每個Activity都需要在AndroidManifest文件中注冊

生命周期

Activity生命周期
方法 詳解
onCreate activity開始創(chuàng)建時調(diào)用 使用場景
onStart activity被啟動時調(diào)用 頁面初始化
onResume 1. 界面首次啟動完成,前端展示 2. activity被彈框遮蓋,失去焦點,處于onPause,再次回到前臺展示頁可交互狀態(tài)時 數(shù)據(jù)恢復(fù)&展示
onPause Activity失去焦點,仍可見(例如:彈框遮蓋) 數(shù)據(jù)存儲、停止動畫、注銷廣播(不能處理耗時任務(wù))
onStop activity不可見狀態(tài),頁面跳轉(zhuǎn)后 數(shù)據(jù)恢復(fù)
onDestroy Activity即將被銷毀 回收、資源釋放

注意:經(jīng)測試,onPause()方法在彈出Dialog時不會被調(diào)用,而在被另一個透明或者Dialog樣式的Activity覆蓋時才會被調(diào)用。

引申問題:
a. 啟動頁面A—>跳轉(zhuǎn)到頁面B—>B返回頁面A,兩個頁面生命周期的變化
答:
A跳轉(zhuǎn)B
onCreate(A)—>onStart(A)—>onResume(A)—>onPause(A)—>onCreate(B)
—>onStart(B)—>onResume(B)—>onStop(A)
B返回A:
onPause(B)—>onRestart(A)—>onStart(A)—>onResume(A)—>onStop(B)—>onDeatory(B)
注意:,如果B是透明的Activity則不會調(diào)用A的onStop(),B是對話框則不會調(diào)用A的onPause()和onStop()
b. 當(dāng)前Activity為A,此時用戶打開ActivityB后,那么A的onPause()和B的onResume()哪個方法先執(zhí)行?
答:先 A的onPause() ,再B的onResume()
Activity的啟動過程:由ActivityManagerService(AMS)對棧內(nèi)的Activity狀態(tài)進行同步管理 & 規(guī)定:新Activity啟動前,棧頂?shù)腁ctivity必須先onPause(),才能啟動新的Activity(執(zhí)行onResume())

四種啟動模式

通常我們能夠直接在 AndroidManifest.xml 文件里面的 <activity> 標(biāo)簽中使用一個屬性指定啟動模式,如:

<activity
    android:name=".SingleTaskActivity"
    android:label="singleTask launchMode"
    android:launchMode="singleTask"/>

啟動模式共包含四種:Standard、SingleTop、SingleTask、SingleInstance,下面我們來一一詳解
standard
標(biāo)準(zhǔn)模式(默認的啟動模式),每次激活A(yù)ctivity時(startActivity),都創(chuàng)建新的Activity實例,并放入任務(wù)棧的棧頂;
singleTop
棧頂模式,singleTop 模式的 Activity 表現(xiàn)形式與 standard 很像,多數(shù)情況下 Activity 實例會按照我們想要的樣子那樣被創(chuàng)建。唯一不同的是,如果在調(diào)用者 Task 棧頂已經(jīng)存在有一個相同類型的 Activity 實例的話,將不會創(chuàng)建新的 Activity,取而代之的是通過 onNewIntent() 方法將 Intent 發(fā)送至這個已經(jīng)存在的 Activity 實例中。

使用 singleTop 模式時,你必須同時在 onCreate()onNewIntent() 方法中接受處理發(fā)送而來的 Intent 數(shù)據(jù),以應(yīng)對所有使用場景。

這種模式的使用案例之一便是搜索功能。想象一下,創(chuàng)建一個能夠跳轉(zhuǎn)至一個展示搜索結(jié)果的 SearchActivity 的搜索框。為了擁有更好的用戶體驗,通常我們會在搜索結(jié)果頁面也放置一個搜索框,使用戶在不需要按返回鍵的情況下搜索其他關(guān)鍵字。

現(xiàn)在設(shè)想一下,如果我們每一次都啟動一個新的 SearchActivity 來展示新的搜索結(jié)果,10 次搜索便產(chǎn)生 10 個新的 Activities。當(dāng)你按返回鍵的時候,就會顯得非常奇怪。因為你不得不按 10 次返回鍵來跳過這些搜索結(jié)果頁面從而返回至你前面的 Activity。

相反的,如果在棧頂有一個 SearchActivity 的話,更好的做法是我們發(fā)送一個 Intent 到已經(jīng)存在的 Activity 實例并讓它更新搜索結(jié)果?,F(xiàn)在只有一個 SearchActivity 位于棧頂,你只需要按一次返回鍵就能回到之前的 Activity。這顯然更有意義。

然而,singleTop 模式僅僅在與調(diào)用者相同的 task 中起作用。如果你希望一個 Intent 被發(fā)送至另一個 Task 里面的已經(jīng)存在的棧頂 Activity 的話,我不得不失望地告訴你這種方式并不奏效。啟動 singleTop Activity 的 Intent 來自另一個應(yīng)用程序時,一個新的 Activity 會被啟動,就像 standard 模式那樣(5.0 以前:放置在調(diào)用者 Task 的棧頂,5.0 開始:創(chuàng)建一個新的 Task)。

singleTask
這種模式與 standard 和 singleTop 截然不同。擁有 singleTask 啟動模式的 Activity 在系統(tǒng)中只允許存在一個實例(有點像單例)。如果系統(tǒng)中已經(jīng)有一個 Activity 實例的話,擁有該實例的 Task 將被移到頂部,并且 Intent 將通過 onNewIntent() 方法傳遞過來。如果沒有,新的 Activity 將被創(chuàng)建并放在對應(yīng)的 Task 中。

singleTask啟動模式啟動Activity時,首先會根據(jù)taskAffinity去尋找當(dāng)前是否存在一個對應(yīng)名字的任務(wù)棧

  • 如果不存在,則會創(chuàng)建一個新的Task,并創(chuàng)建新的Activity實例入棧到新創(chuàng)建的Task中去
  • 如果存在,則得到該任務(wù)棧,查找該任務(wù)棧中是否存在該Activity實例
    如果存在實例,則將它上面的Activity實例都出棧,然后回調(diào)啟動的Activity實例的onNewIntent方法
    如果不存在該實例,則新建Activity,并入棧
  • 此外,我們可以將兩個不同App中的Activity設(shè)置為相同的taskAffinity,這樣雖然在不同的應(yīng)用中,但是Activity會被分配到同一個Task中去。

singleInstance

如果這種模式很接近 singleTask,只允許系統(tǒng)中存在一個 Activity 實例。如果使用這種模式的 Activity 打開另一個 Activity,系統(tǒng)將自動創(chuàng)建一個新的 Task 來容納新的 Activity

一旦該模式的Activity被創(chuàng)建,任何應(yīng)用激活改Activity都會重用該棧中的Activity實例(即多應(yīng)用共享該棧中的Activity實例)

卡頓原因


關(guān)于內(nèi)存泄漏 & 性能優(yōu)化,請看系列文章:
Android性能優(yōu)化:這是一份全面&詳細的內(nèi)存優(yōu)化指南
Android性能優(yōu)化:手把手帶你全面了解 內(nèi)存泄露 & 解決方案
Android性能優(yōu)化:那些關(guān)于Bitmap圖片資源優(yōu)化的小事
Android性能優(yōu)化:手把手帶你全面了解 繪制優(yōu)化
Android性能優(yōu)化:布局優(yōu)化 詳細解析(含、講解 )

Activity啟動加速

緩存方式(狀態(tài)緩存)


參考鏈接:
http://blog.csdn.net/sbsujjbcy/article/details/49360615
https://juejin.cn/post/6844903684057350158
demo示例代碼:https://github.com/shan1231/Shan_AndroidStudy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容