一、什麼是 Activity?
Activity是Android組件中最基本也是最爲常見用的四大組件(Activity,Service服務,Content Provider內容提供,BroadcastReceiver廣播接收器)之一。html
二、請描述一下 Activity 生命週期android
咱們就來講一說這幾個過程。面試
1.啓動Activity:系統會先調用onCreate方法,而後調用onStart方法,最後調用onResume,Activity進入運行狀態。數據庫
2.當前Activity被其餘Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。安全
3.當前Activity由被覆蓋狀態回到前臺或解鎖屏:系統會調用onResume方法,再次進入運行狀態。app
4.當前Activity轉到新的Activity界面或按Home鍵回到主屏,自身退居後臺:系統會先調用onPause方法,而後調用onStop方法,進入停滯狀態。ide
5.用戶後退回到此Activity:系統會先調用onRestart方法,而後調用onStart方法,最後調用onResume方法,再次進入運行狀態。this
6.當前Activity處於被覆蓋狀態或者後臺不可見狀態,即第2步和第4步,系統內存不足,殺死當前Activity,然後用戶退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。spa
7.用戶退出當前Activity:系統先調用onPause方法,而後調用onStop方法,最後調用onDestory方法,結束當前Activity。code
Activity 從建立到銷燬有多種狀態,從一種狀態到另外一種狀態時會激發相應的回調方法,這些回調方法包括:onCreate onStart onResume onPause onStop onDestroy其實這些方法都是兩兩對應的,onCreate 建立與 onDestroy 銷燬;onStart 可見與 onStop 不可見;onResume 可編輯(即焦點)與 onPause;常 見 的 Activity 類 型 有 FragmentActivitiy,ListActivity ,TabAcitivty 等。
四、如何保存 Activity 的狀態?
Activity 的狀態一般狀況下系統會自動保存的,只有當咱們須要保存額外的數據時才須要使用到這樣的功能。通常來講, 調用 onPause()和 onStop()方法後的 activity 實例仍然存在於內存中, activity 的全部信息和狀態數據不會消失, 當 activity 從新回到前臺以後, 全部的改變都會獲得保留。可是當系統內存不足時, 調用 onPause()和 onStop()方法後的 activity 可能會被系統摧毀, 此時內存中就不會存有該 activity 的實例對象了。若是以後這個 activity 從新回到前臺, 以前所做的改變就會消失。爲了不此種狀況發生 , 我 們 可 以 覆 寫 onSaveInstanceState() 方 法 。onSaveInstanceState()方法接受一個 Bundle 類型的參數, 開發者能夠將狀態數據存儲到這個Bundle 對象中, 這樣即便 activity 被系統摧毀, 當用戶從新啓動這個 activity 而調用它的 onCreate()方法時, 上述的 Bundle 對象會做爲實參傳遞給 onCreate()方法, 開發者能夠從 Bundle 對象中取出保存的數據, 而後利用這些數據將 activity 恢復到被摧毀以前的狀態。須要注意的是, onSaveInstanceState()方法並非必定會被調用的, 由於有些場景是不須要保存狀態數據的. 好比用戶按下 BACK 鍵退出 activity 時, 用戶顯然想要關閉這個 activity, 此時是沒有必要 保 存 數 據 以 供 下 次 恢 復 的 , 也 就 是 onSaveInstanceState() 方 法 不 會 被 調 用 . 如 果 調 用onSaveInstanceState()方法, 調用將發生在 onPause()或 onStop()方法以前。
@Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); }
五、兩個 Activity 之間跳轉時必然會執行的是哪幾個方法?
通常狀況下好比說有兩個activity,分別叫A,B,當在A裏面激活B組件的時候, A會調用 onPause()方法,而後 B 調用 onCreate() ,onStart(), onResume()。
這個時候 B 覆蓋了窗體, A 會調用 onStop()方法. 若是 B 是個透明的,或者是對話框的樣式, 就不會調用 A 的 onStop()方法。
六、橫豎屏切換時 Activity 的生命週期
此時的生命週期跟清單文件裏的配置有關係。
1.不設置 Activity 的 android:configChanges 時,切屏會從新調用各個生命週期默認首先銷燬當前 activity,而後從新加載。
2.設置 Activity android:configChanges="orientation|keyboardHidden|screenSize"時,切屏不會從新調用各個生命週期,只會執行 onConfigurationChanged 方法。一般在遊戲開發, 屏幕的朝向都是寫死的。
七、如何將一個 Activity 設置成窗口的樣式
只須要給咱們的 Activity 配置以下屬性便可。android:theme="@android:style/Theme.Dialog"
八、如何退出Activity?如何安全退出已調用多個Activity 的Application?
(1)一般狀況用戶退出一個 Activity 只需按返回鍵,咱們寫代碼想退出 activity 直接調用 finish()方法就行。
(2)記錄打開的 Activity:每打開一個 Activity,就記錄下來。在須要退出時,關閉每個 Activity 便可。
//僞代碼 List<Activity> lists ;// 在 application 全局的變量裏面 lists = new ArrayList<Activity>(); lists.add(this); for(Activity activity: lists) { activity.finish(); } lists.remove(this);
(3)發送特定廣播:
在須要結束應用時,發送一個特定的廣播,每一個 Activity 收到廣播後,關閉便可。
//給某個 activity 註冊接受接受廣播的意圖 registerReceiver(receiver, filter) //若是過接受到的是 關閉 activity 的廣播 就調用 finish()方法 把當前的 activity finish()掉
(4)遞歸退出
在打開新的 Activity 時使用 startActivityForResult,而後本身加標誌,在 onActivityResult 中處理,遞歸關閉。
(5)其實也能夠經過 intent 的 flag 來實現 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)激活一個新的 activity。此時若是該任務棧中已經有該 Activity,那麼系統會把這個 Activity 上面的全部 Activity 幹掉。其實至關於給 Activity 配置的啓動模式爲 SingleTop。
九、Activity 的四種啓動模式,singletop 和 singletask 區別是什麼?通常書籤的使用模式是 singletop,那爲何不使用 singletask?
singleTop 跟 standard 模式比較相似。惟一的區別就是,當跳轉的對象是位於棧頂的 activity(應該能夠理解爲用戶眼前所 看到的 activity)時,程序將不會生成一個新的 activity 實例,而是直接跳到現存於棧頂的那個 activity 實例。拿上面的例子來講,當 Act1 爲 singleTop 模式時,執行跳轉
後棧裏面依舊只有一個實例,若是如今按返回鍵程序將直接退出。singleTask 模式和 singleInstance 模式都是隻建立一個實例的。在這種模式下,不管跳轉的對
象是否是位於棧頂的 activity,程序都不會生成一個新的實例(固然前提是棧裏面已經有這個實例)。這種模式至關有用,在之後的多 activity 開發中,常會由於跳轉的關係致使同個頁面生成多個實例,這個在用戶體驗上始終有點很差,而若是你將對應的 activity 聲明爲 singleTask 模式,這種問題將不復存在。在主頁的 Activity 很經常使用
十、Android 中的 Context, Activity,Appliction 有什麼區別?
相同:Activity 和 Application 都是 Context 的子類。Context 從字面上理解就是上下文的意思, 在實際應用中它也確實是起到了管理上下文環境中各個參
數和變量的總用,方便咱們能夠簡單的訪問到各類資源。不一樣:維護的生命週期不一樣。 Context 維護的是當前的 Activity 的生命週期,Application 維護
的是整個項目的生命週期。使用 context 的時候,當心內存泄露,防止內存泄露,注意一下幾個方面:
1. 不要讓生命週期長的對象引用 activity context,即保證引用 activity 的對象要與 activity 自己生命週期是同樣的。
2. 對於生命週期長的對象,可使用 application,context。
3. 避免非靜態的內部類,儘可能使用靜態類,避免生命週期問題,注意內部類對外部對象引用致使的生命週期變化。
十一、兩個 Activity 之間傳遞數據,除了 intent,廣播接收者,contentprovider 還有啥?
1)利用 static 靜態數據,public static 成員變量
2)利用外部存儲的傳輸,
例如 File 文件存儲
SharedPreferences 首選項
Sqlite 數據庫
十二、Context 是什麼?一、它描述的是一個應用程序環境的信息,即上下文。二、該類是一個抽象(abstract class)類,Android 提供了該抽象類的具體實現類(ContextIml)。三、 經過它咱們能夠獲取應用程序的資源和類, 也包括一些應用級別操做, 例如: 啓動一個 Activity,發送廣播,接受 Intent,信息,等。