1、什么是Activity
Android的四大組件之一,context的子類,一個Activity通常展現為一個可視化的界面,是Android程序與用戶交互的窗口,也是Android組件中最基本也是最復雜的一個組件。從視覺效果來看,一個Activity占據當前的窗口,響應所有窗口事件,具備有控件,菜單等界面元素。從內部邏輯來看,Activity需要為了保持各個界面狀態,需要做很多持久化的事情,還需要妥善管理生命周期,和一些轉跳邏輯。
2、Activity的生命周期
Activity 從創建到銷毀有多種狀態,從一種狀態到另一種狀態時會激發相應 的回調方法,這些回調方法包括:onCreate onStart onResume onPause onStop onDestroy ,如下圖所示:
- onCreate Activity創建時的初始化工作 如設置頁面的ContentView,控件的初始化,接收參數等等。
- onRestart Activity跳轉到其他頁面并執行onStop之后,重新啟動時會回調onRestart方法。
- onStart Activity正在啟動,即將開始,沒有出現在前臺,還無法和用戶交互,可以理解為已經初始化完成,但是處于后臺我們暫時沒法看見。
- onResume Activity可見了并且處于前臺獲取到焦點(和onStart最大的不同就是onStart是在后臺已經初始化完但是無法交互)。
- onPause 失去焦點不可以交互、處于后臺。
- onStop 即將停止,做一些稍微重量級回收類的工作
- onDestory Activity即將被銷毀,需要們做一些回收和資源釋放類的工作。
3、后臺的activity被系統回收怎么辦?如何在被系統回收之前保存當前狀態?
當一個Activity被pause或者stop的時候,這個Activity的對象實際上還是保存在內存中,因此當 activity 重新回到前臺之后這個Activity中的信息(成員和狀態信息)還可以重新獲取到.
如果系統為了整理內存而銷毀了Activity對象時,系統沒法簡單的原封不動地恢復先前的Activity對象及其狀態信息.
Activity中提供了一個方法:onSavedInstanceState(Bundle obj).當系統銷毀一個Activity時,會將Activity的狀態信息已鍵值對形式存放在bundle對象中.
第一次啟動Activity時,這個bundle對象是空的,null.如果Activity被系統銷毀了,然后用戶要回退回去看的話,系統會調用這個Activity的onCreate方法,并把bundle對象傳遞過去.
4、橫豎屏切換時 Activity 的生命周期
- 不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
- 設置Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次
- 設置Activity的android:configChanges=”orientation|keyboardHidden”時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法
5、如何將一個 Activity 設置成窗口的樣式?
只需要在AndroidManifest.xml給我們的 Activity 配置如下屬性即可。
android:theme=”@android:style/Theme.Dialog”
或者
android:theme="@style/Theme.AppCompat.Dialog"
(根據api不同選擇)
6 、如何退出 Activity?如何安全退出已調用多個 Activity 的 Application?
對于單一 Activity 的應用來說,退出很簡單,直接 finish()即可,當然,也可以用 killProcess()和 System.exit()這樣的方法,為了編程方便,最好定義一個 Activity 基類,處理這些共通問題。
- 記錄打開的 Activity:每打開一個 Activity,就記錄下來。在需要退出時,關閉每一個 Activity 即可。
- 發送特定廣播:在需要結束應用時,發送一個特定的廣播,每個 Activity 收到廣播后,關閉即可。
7、Activity 的四種啟動模式,singletop 和 singletask 區別是什么?一般書簽的使用模式是 singletop,那為什么 不使用 singletask?
- standard: 標準模式,一調用 startActivity()方法就會產生一個新的實例。
- singleTop: 如果已經有一個實例位于 Activity 棧的頂部時, 就不產生新的實例, 而只是調用Activity 中的 newInstance()方法。如果不位于棧頂,會產生一個新的實例。
- singleTask: 會在一個新的 task 中產生這個實例,以后每次調用都會使用這個,不會去產生 新的實例了。
- singleInstance: 這個跟 singleTask 基本上是一樣, 只有一個區別: 在這個模式下的 Activity實例所處的 task 中,只能有這個 activity實例,不能有其他的實例。
8、Android 中的 Context, Activity,Appliction 有什么區別?
1.Context 從字面上理解就是上下文的意思,在實際應用中它也確實是起到了管理上下文環境中各個參數和變量的總用,方便我們可以簡單的訪問到各種資源。
2.Activity 和 Application 都是 Context 的子類。
3.Context 維護的是當前的 Activity 的生命周期,Application 維護的是整個項目的生命周期。
9、Android Service與Activity之間通信的幾種方式?
10、如果新Activity是透明主題時,舊Activity會不會走onStop?
答:不會。