Android面试题之Activity篇
Activity篇目錄
- 前言
- 一、 Activity
- 1、什么是 Activity?
- 2、請描述一下 Activity 生命周期
- 3、請描述一下Activity的四個狀態
- 4、兩個 Activity 之間傳遞數據,除了 intent,廣播接收者,content provider 還有啥?
- 5、Android 中的 Context, Activity,Appliction 有什么區別?
- 6、Context 是什么?
- 7、如何保存 Activity 的狀態?
- 8、橫豎屏切換時 Activity 的生命周期
- 9、兩個 Activity 之間跳轉時必然會執行的是哪幾個方法?
- 10、如何將一個 Activity 設置成窗口的樣式
- 11、Activity 的四種啟動模式,singletop 和 singletask 區別是什么?
- 12、Activity 的四種啟動模式,一般書簽的使用模式是 singletop,那為什么不使用 singletask?
- 13、如何退出 Activity ?如何安全退出已調用多個 Activity 的Application?
- 14、Activity-Window-View三者的關系
- 關于整理問題
前言
秋招在即,計蒙準備在國慶假期結束前整理一套Android初級面試題籍,希望對大家有所幫助
提示:以下是本篇文章正文內容
一、 Activity
1、什么是 Activity?
四大組件之一,一般的,一個用戶交互界面對應一個 activity
setContentView() ,// 要顯示的布局activity 是 Context 的子類,同時實現了 window.callback 和 keyevent.callback, 可以處理與窗體用戶交互的事件
button.setOnclickLinstener{ }//點擊事件我在開發常用的的有 FragmentActivitiy,ListActivity ,PreferenceActivity ,TabAcitivty 等…如果界面有共同的特點或者功能的時候,還會自己定義一個 BaseActivity
2、請描述一下 Activity 生命周期
Activity 從創建到銷毀有多種狀態,從一種狀態到另一種狀態時會激發相應的回調方法,這些回調方法包括:
onCreate onStart onResume onPause onStop onDestroy,onRestart這些方法大都是兩兩對應的
onCreate 創建與 onDestroy 銷毀 onStart 可見與 onStop 不可見 onResume 可編輯(即焦點)與 onPause3、請描述一下Activity的四個狀態
running-poused-stopped-killed1.running->當前顯示在屏幕的activity(位于任務棧的頂部),用戶可見狀態。
2.poused->依舊在用戶可見狀態,但是界面焦點已經失去,此Activity無法與用戶進行交互。
3.stopped->用戶看不到當前界面,也無法與用戶進行交互 完全被覆蓋.
4.killed->當前界面被銷毀,等待這系統被回收
4、兩個 Activity 之間傳遞數據,除了 intent,廣播接收者,content provider 還有啥?
1)利用 static 靜態數據,public static 成員變量
2)利用外部存儲的傳輸,例如 File 文件存儲
5、Android 中的 Context, Activity,Appliction 有什么區別?
- 相同:Activity 和 Application 都是 Context 的子類。 Context
從字面上理解就是上下文的意思,在實際應用中它也確實是起到了管理上下文環境中各個參數和變量的總用,方便我們可以簡單的訪問到各種資源。 - 不同:維護的生命周期不同。 Context 維護的是當前的 Activity 的生命周期,Application維護的是整個項目的生命周期。 使用 context 的時候,小心內存泄露,防止內存泄露,注意一下幾個方面:
1.不要讓生命周期長的對象引用 activity context,即保證引用 activity 的對象要與 activity 本身生命周期是一樣的。
2.對于生命周期長的對象,可以使用 application,context。
3.避免非靜態的內部類,盡量使用靜態類,避免生命周期問題,注意內部類對外部對象引用導致的生命周期變化。
6、Context 是什么?
1、它描述的是一個應用程序環境的信息,即上下文。
2、該類是一個抽象(abstract class)類,Android 提供了該抽象類的具體實現類(ContextIml)。
3、通過它我們可以獲取應用程序的資源和類,也包括一些應用級別操作,例如:啟動一個 Activity,發送廣播,接受 Intent,信息,等。
7、如何保存 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()方法之前。
8、橫豎屏切換時 Activity 的生命周期
此時的生命周期跟清單文件里的配置有關系。
-
不設置 Activity 的 android:configChanges 時,切屏會重新調用各個生命周期默認首先銷毀當前activity,然后重新加載。
-
設置 Activity的android:configChanges="orientation|keyboardHidden|screenSize"時,切屏不會重新調用各個生命周期,只會執行 onConfigurationChanged 方法。
通常在游戲開發, 屏幕的朝向都是寫死的。
9、兩個 Activity 之間跳轉時必然會執行的是哪幾個方法?
一般情況下比如說有兩個activity,分別叫A,B
當在A里面激活B組件的時候, A會調用 onPause()方法,然后 B 調用 onCreate() ,onStart(), onResume()。
這個時候 B 覆蓋了窗體, A 會調用 onStop()方法. 如果 B 是個透明的,或者是對話框的樣式, 就不會調用 A 的 onStop()方法。
10、如何將一個 Activity 設置成窗口的樣式
只需要給 Activity 配置如下屬性即可。
android:theme="@android:style/Theme.Dialog"11、Activity 的四種啟動模式,singletop 和 singletask 區別是什么?
singleTop 跟 standard 模式比較類似。唯一的區別就是,當跳轉的對象是位于棧頂的 activity(應該可以理解為用戶眼前所 看到的 activity)時,程序將不會生成一個新的 activity 實例,而是直接跳到現存于棧頂的那個 activity 實例。拿上面的例子來說,當 Act1 為 singleTop 模式時,執行跳轉后棧里面依舊只有一個實例,如果現在按返回鍵程序將直接退出。
12、Activity 的四種啟動模式,一般書簽的使用模式是 singletop,那為什么不使用 singletask?
singleTask 模式和 singleInstance 模式都是只創建一個實例的。在這種模式下,無論跳轉的對象是不是位于棧頂的 activity,程序都不會生成一個新的實例(當然前提是棧里面已經有這個實例)。這種模式相當有用,在以后的多 activity 開發中,常會因為跳轉的關系導致同個頁面生成多個實例,這個在用戶體驗上始終有點不好,而如果你將對應的 activity 聲明為 singleTask 模式,這種問題將不復存在。在主頁的 Activity 很常用
13、如何退出 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。
14、Activity-Window-View三者的關系
Activity:是安卓四大組件之一,負責界面展示、用戶交互與業務邏輯處理;
Window:是負責界面展示以及交互的職能部門,就相當于Activity的下屬,Activity的生命周期方法負責業務的處理;
View:是放在Window容器的元素,Window是View的載體,View是Window的具體展示。
Activity通過Window來實現視圖元素的展示,window可以理解為一個容器,盛放著一個個的view,用來執行具體的展示工作。
關于整理問題
當全部整理完畢后將整理成pdf格式,以方便閱讀,文件獲取如下圖(10月8日后)
總結
以上是生活随笔為你收集整理的Android面试题之Activity篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux的strings命令_拔剑-浆
- 下一篇: 二级语法总结190