Android 面試題--Activity,android--activity
1、什麼是 Activity?
Activity是Android組件中最基本也是最為常見用的四大組件(Activity,Service服務,Content Provider內容提供,BroadcastReceiver廣播接收器)之一。
Activity是一個應用程式組件,提供一個螢幕,使用者可以用來互動為了完成某項任務。Activity中所有操作都與使用者密切相關,是一個負責與使用者互動的組件,可以通過setContentView(View)來顯示指定控制項。在一個android應用中,一個Activity通常就是一個單獨的螢幕,它上面可以顯示一些控制項也可以監聽並處理使用者的事件做出響應。Activity之間通過Intent進行通訊。我開發常用的的有 FragmentActivitiyListActivity ,PreferenceActivity ,TabAcitivty 等…本文地址:http://www.cnblogs.com/wuyudong/p/5959056.html,轉載請註明出處。
2、請描述一下 Activity 生命週期
我們就來說一說這幾個過程。
1.啟動Activity:系統會先調用onCreate方法,然後調用onStart方法,最後調用onResume,Activity進入運行狀態。
2.當前Activity被其他Activity覆蓋其上或被鎖屏:系統會調用onPause方法,暫停當前Activity的執行。
3.當前Activity由被覆蓋狀態回到前台或解鎖屏:系統會調用onResume方法,再次進入運行狀態。
4.當前Activity轉到新的Activity介面或按Home鍵回到主屏,自身退居後台:系統會先調用onPause方法,然後調用onStop方法,進入停滯狀態。
5.使用者後退回到此Activity:系統會先調用onRestart方法,然後調用onStart方法,最後調用onResume方法,再次進入運行狀態。
6.當前Activity處於被覆蓋狀態或者後台不可見狀態,即第2步和第4步,系統記憶體不足,殺死當前Activity,而後使用者退回當前Activity:再次調用onCreate方法、onStart方法、onResume方法,進入運行狀態。
7.使用者退出當前Activity:系統先調用onPause方法,然後調用onStop方法,最後調用onDestory方法,結束當前Activity。
Activity 從建立到銷毀有多種狀態,從一種狀態到另一種狀態時會激發相應的回調方法,這些回調方法包括:onCreate onStart onResume onPause onStop onDestroy其實這些方法都是兩兩對應的,onCreate 建立與 onDestroy 銷毀;onStart 可見與 onStop 不可見;onResume 可編輯(即焦點)與 onPause;常 見 的 Activity 類 型 有 FragmentActivitiy,ListActivity ,TabAcitivty 等。
4、如何儲存 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()方法之前。
@Overrideprotected void onSaveInstanceState(Bundle outState) {// TODO Auto-generated method stubsuper.onSaveInstanceState(outState);}
5、兩個 Activity 之間跳轉時必然會執行的是哪幾個方法?
一般情況下比如說有兩個activity,分別叫A,B,當在A裡面啟用B組件的時候, A會調用 onPause()方法,然後 B 調用 onCreate() ,onStart(), onResume()。
這個時候 B 覆蓋了表單, A 會調用 onStop()方法. 如果 B 是個透明的,或者是對話方塊的樣式, 就不會調用 A 的 onStop()方法。
6、橫豎屏切換時 Activity 的生命週期
此時的生命週期跟資訊清單檔裡的配置有關係。
1.不設定 Activity 的 android:configChanges 時,切屏會重新調用各個生命週期預設首先銷毀當前 activity,然後重新載入。
2.設定 Activity android:configChanges="orientation|keyboardHidden|screenSize"時,切屏不會重新調用各個生命週期,只會執行 onConfigurationChanged 方法。通常在遊戲開發, 螢幕的朝向都是寫死的。
7、如何將一個 Activity 設定成視窗的樣式
只需要給我們的 Activity 配置如下屬性即可。android:theme="@android:style/Theme.Dialog"
8、如何退出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。
9、Activity 的四種啟動模式,singletop 和 singletask 區別是什嗎?一般書籤的使用模式是 singletop,那為什麼不使用 singletask?
singleTop 跟 standard 模式比較類似。唯一的區別就是,當跳轉的對象是位於棧頂的 activity(應該可以理解為使用者眼前所 看到的 activity)時,程式將不會產生一個新的 activity 執行個體,而是直接跳到現存於棧頂的那個 activity 執行個體。拿上面的例子來說,當 Act1 為 singleTop 模式時,執行跳轉
後棧裡面依舊只有一個執行個體,如果現在按返回鍵程式將直接退出。singleTask 模式和 singleInstance 模式都是只建立一個執行個體的。在這種模式下,無論跳轉的對
象是不是位於棧頂的 activity,程式都不會產生一個新的執行個體(當然前提是棧裡面已經有這個執行個體)。這種模式相當有用,在以後的多 activity 開發中,常會因為跳轉的關係導致同個頁面產生多個執行個體,這個在使用者體驗上始終有點不好,而如果你將對應的 activity 聲明為 singleTask 模式,這種問題將不複存在。在首頁的 Activity 很常用
10、Android 中的 Context, Activity,Appliction 有什麼區別?
相同:Activity 和 Application 都是 Context 的子類。Context 從字面上理解就是內容相關的意思, 在實際應用中它也確實是起到了管理上下文環境中各個參
數和變數的總用,方便我們可以簡單的訪問到各種資源。不同:維護的生命週期不同。 Context 維護的是當前的 Activity 的生命週期,Application 維護
的是整個項目的生命週期。使用 context 的時候,小心記憶體泄露,防止記憶體泄露,注意一下幾個方面:
1. 不要讓生命週期長的對象引用 activity context,即保證引用 activity 的對象要與 activity 本身生命週期是一樣的。
2. 對於生命週期長的對象,可以使用 application,context。
3. 避免非靜態內部類,盡量使用靜態類,避免生命週期問題,注意內部類對外部對象引用導致的生命週期變化。
11、兩個 Activity 之間傳遞資料,除了 intent,廣播接收者,contentprovider 還有啥?
1)利用 static 待用資料,public static 成員變數
2)利用外部儲存的傳輸,
例如 File 檔案儲存體
SharedPreferences 喜好設定
Sqlite 資料庫
12、Context 是什嗎?
1、它描述的是一個應用程式環境的資訊,即上下文。
2、該類是一個抽象(abstract class)類,Android 提供了該抽象類別的具體實作類別(ContextIml)。
3、 通過它我們可以擷取應用程式的資源和類, 也包括一些應用層級操作, 例如: 啟動一個 Activity,發送廣播,接受 Intent,資訊,等。