什么是Activity?
與用戶交互的接口,提供用戶觸摸,點擊,滑動的界面。Android中的activity全都歸屬于task管理 。task 是多個 activity 的集合,這些 activity 按照啟動順序排隊存入一個棧(即“back stack”)。android默認會為每個App維持一個task來存放該app的所有activity,task的默認name為該app的packagename。
四種狀態(tài)?
- running
活動狀態(tài),也是activity處于棧頂?shù)臓顟B(tài),這時用戶觸摸屏幕,activity會響應事件 - paused
activity失去焦點或者被比如對話框覆蓋時的狀態(tài),這時activity只是失去焦點,所有的成員變量和狀態(tài)都還在 - stopped
被其它Activity完全覆蓋 - killed
activity被銷毀
Activity生命周期,常見類型概述

第一想到的是那副經典的生命周期圖,怎么敘述呢。Activity可以理解為一個界面,為了便于界面編程,安卓設計者賦予了Activity生命周期的概念,從產生到消亡,我們開發(fā)者可以在生命周期的對應階段做相應處理,那么怎么做處理呢?就是Activity每到一個生命周期的階段,就會回調對應的一個方法,比如創(chuàng)建時回調onCreate()。然后我簡單介紹下Activity的一個完整的生命周期是怎樣的順序:
- 首先創(chuàng)建時回調onCreate(),這里可以進行一些初始化操作,比如設置布局資源,然后onStart(),表明Acitivity正在啟動,activity已處于可見狀態(tài),但是還沒有處于前臺顯示的,就是用戶還不能在此Activity進行交互。接著是onResume(),這個調用后會處于前臺可見狀態(tài),用戶可進行交互。
- 點擊Home鍵回到主界面(Activity不可見),會讓activity退居到后臺,這時onPause()會被調用,一般情況下,onStop()會在onPause()執(zhí)行后調用,這時候表明整個Activity被停止或被完全覆蓋,因為這個時候activity是不可見得,完全處于后臺運行,另外當調用onPause后,如果系統(tǒng)內存吃緊,activity是有可能被回收的。
- 當我們再次回到原Activity時,onRestart()會調用,表示這個Activity正在重新啟動,從桌面回到APP,,onRestart()調用完后會調用onStart(),activity回到可見狀態(tài),和前面一樣之后調用onResume,activity回到前臺可見可交互狀態(tài)。
- 退出當前Activity時->onPause() -> onStop() -> onDestroy(),onDestroy會在activity徹底銷毀前調用
anroid 進程優(yōu)先級
- 前臺:處于前臺和用戶交互的activity或者和前臺進程Activity綁定的Service所處的進程
- 可見:處于可見,但不處于前臺,用戶不可以交互的進程
- 服務:后臺開啟的Service服務
- 后臺:點擊了Home,前臺進程變?yōu)楹筇爝M程
- 空
activity被回收的狀態(tài)和信息保存和恢復過程
onSaveInstanceState方法在Activity可能被回收之前調用,用來保存自己的狀態(tài)和信息,以便回收后重建時恢復數(shù)據(在onCreate()或onRestoreInstanceState()中恢復),旋轉屏幕重建Activity會調用此方法,而且要調用的話就一定發(fā)生在onStop方法之前,但并不保證發(fā)生在onPause的前面還是后面。onRestoreInstanceState方法這個方法在onStart 和 onPostCreate之間調用,在onCreate中也可以狀態(tài)恢復,但有時候需要所有布局初始化完成后再恢復狀態(tài)。
Activity的啟動模式,每個啟動模式的不同點是什么?
啟動模式簡單的說就是定義Activity實例與tack的關聯(lián)方式
為什么定義啟動模式:
- 讓某些Activity啟動一個新的task
- 讓activity復用,而不是重新創(chuàng)建一個實例
定義方式:
- 使用manitest文件,通過Activity的 android:launchMode="standard"屬性
- intent設置:靠Flag
- FLAG_ACTIVITY_NEW_TASK:指定為singleTask模式
- FLAG_ACTIVITY_SINGLE_TOP:指定為singleTop模式
- FLAG_ACTIVITY_CLEAR_TOP:標識此Activity,當它啟動時,在同一個任務棧中位于它上面的Activity都要出棧
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:標識此Activity不會出現(xiàn)在歷史Activity的列表中
哪些啟動模式:
- standard 標準模式:總會為activity創(chuàng)建一個新的實例,并將該實例添加到當前task中,這種方式不會啟動新的Task,只是將新的 Activity添加到原有的Task中。
- singleTop:棧頂復用模式,這種模式下,如果新Activity已經位于任務棧的棧頂,那么此Activity不會被重新創(chuàng)建,同時他的onNewIntent方法會被回調。
- singleTask:棧內復用模式
- singleInstance:單實例模式,此種模式的Activity只能單獨的位于一個任務棧中
如何在非活動Activity內存不足時被系統(tǒng)銷毀前保存數(shù)據?
Activity中提供了一個方法:onSavedInstanceState(Bundle obj).當系統(tǒng)銷毀一個Activity時,會將Activity的狀態(tài)信息已鍵值對形式存放在bundle對象中. 第一次啟動Activity時,這個bundle對象是空的,null.如果Activity被系統(tǒng)銷毀了,然后用戶要回退回去看的話,系統(tǒng)會調用這個Activity的onCreate方法,并把bundle對象傳遞過去.
橫豎屏切換時,Activity的生命周期會有那些變化?
1、不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次
2、設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執(zhí)行一次
3、設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命周期,只會執(zhí)行onConfigurationChanged方法
Activity如何設置為Dialog樣式?
在AndroidManifest.xml 中定義Activity的地方一句話android:theme=”@android:style/Theme.Dialog”或android:theme=”@android:style/Theme.Translucent”就變成半透明的,也可以在onCreate代碼中設置主題。
Context,Application,Activity的區(qū)別與聯(lián)系?
Context:提供應用環(huán)境全局信息的接口,并且這個接口是由抽象類實現(xiàn)的,它的執(zhí)行被android系統(tǒng)所提供,允許我們獲取以應用為特征的資源和類型,同時啟動應用級的操作,如啟動Activity,broadcasting和接收intent。
Application-Context的生命周期與Application的生命周期相關,context隨著Application的銷毀而銷毀,伴隨application的一生,與Activity的生面周期無關。
Activity-Context:這個Context的生命周期是和得到它的引用的Activity一樣長,如果這個Activity結束了,那么,這個Context也會得到釋放
使用context的時候,要小心內存泄漏,防止內存泄漏
- 不要讓生命周期長的對象引用Activity context,即保證引用activity的對象要與activity本身生命周期是一樣的
- 對于生命周期長的對象,可以使用Application-context
- 避免非靜態(tài)的內部類,盡量使用靜態(tài)類,避免生命周期問題,注意內部類對外部類對象引用導致的生命周期的變化。
Activity之間進行數(shù)據傳遞的方式有哪些?
- intent傳遞數(shù)據
- 先把數(shù)據保存到本地,然后在下一個Activity中從本地獲取,存儲方式可以是四種持久化存儲方式:SharePreferences,SQlite,Content Provider和File
- 使用EventBus類似的事件總線
- 使用廣播
如何退出Activity?如何安全退出已調用多個Activity的Application?
- 記錄打開的Activity:每打開一個Activity,就記錄下來,在需要退出時,關閉每一個Activity,Activity記錄可在自定義的Application執(zhí)行,Application可實現(xiàn)一個接口,該接口會返回相應啟動或銷毀的Activity實例
- 在需要結束應用時,發(fā)送一個特定的廣播,每一個Activity收到廣播后關閉
- 通過intent的flag來實現(xiàn),根據應用界面的交互場景利用Activity的啟動模式來設計。