
已經分享過五篇關于Java相關的面試題了,這篇我們分享Android相關的,其實從最近的面試中也多多少少發現,面試當中基礎部分占很大一部分的,索性今天就整理下基礎部分的面試點。
Android問題 1: Activity生命周期 答案【答案不唯一,可自己衡量】:老生常談的一個知識點,基礎中的基礎,最近關于這個相關的面試點有,當我下拉通知欄時,Activity會走什麼生命周期,以及彈出Dialog時會走什麼生命周期;關于這兩知識點,今天特意寫了一下,發現啥都沒走,也就說任何生命周期都不會走,也簡單查了一下原因,下拉通知欄因為是系統視窗,是以不影響activity的生命周期,Dialog或者Toast源碼中也能看windowmanager.addView(),也就說都是和系統管理者有關系,不會影響到本應用。
除了上面兩個最近問到的,一些常見的,也給大家總結一下,總結之前,我們也看看各個生命周期的描述:
1、onCreate()這個方法在每一個Activity類都會有,當我們建立一個Activity類時,一定會重寫父類的onCreate方法,onCreate方法會在Activity第一次被建立時調用。我們應該在這個方法中完成Activity的初始化操作,比如說加載布局,初始化布局控件,綁定按鈕事件等。
2、onStart()這個方法在Activity由不可見變為可見時調用。
3、onResume()這個方法在Activity準備好喝使用者互動的時候調用。此時的Activity一定位于傳回棧的棧頂,并且處于運作狀态。
4、onPause()這個方法在系統準備去啟動或者恢複另一個Activity的時候調用。
5、onStop()這個方法在Activity完全不可見的時候調用。它和onPause()方法的主要差別在于,如果啟動的新Activity是一個對話框式的activity,那麼,onPause()方法會得到執行,而onStop()方法并不會執行。
6、onDestory()這個方法在Activity被銷毀之前調用,之後Activity的狀态将變為銷毀狀态。
7、onRestart()這個方法在Activity由停止狀态變為運作狀态之前調用,也就是Activity被重新啟動了。
8、onAttachedToWindowonAttachedToWindow方法是在Act resume的時候被調用的,也就是act對應的window被添加的時候,且每個view隻會被調用一次,父view的調用在前,不論view的visibility狀态都會被調用,适合做些view特定的初始化操作;
9、onDetachedFromWindowonDetachedFromWindow方法是在Act destroy的時候被調用的,也就是act對應的window被删除的時候,且每個view隻會被調用一次,父view的調用在後,也不論view的visibility狀态都會被調用,适合做最後的清理操作;
各種情況概述: 建立ActivityonCreate => onStart => onResume=> onAttachedToWindow
銷毀 ActivityonPause => onStop => onDestroy=>onDetachedFromWindow
按電源鍵或按home:onPause => onSaveInstanceState => onStop
電源鍵後解鎖或home回來:onRestart => onStart => onResume
從A跳到Bonpause oncreate onstart onresume onattchedtowindow onsaveinstance onstop
跳到第二個頁面的時候,為什麼會調用onstop防止在建立第二個頁面的時候發生意外(啟動不正常,閃退,不顯示等問題)
Android問題 2: Activity與Fragment如何通信 答案【答案不唯一,可自己衡量】:Activity如何向fragment傳遞資料呢?
可以通過setArguments傳遞BundleBundle bundle = new Bundle();
bundle.putString(KEY_TITLE,title);
SimpleFragment fragment = new SimpleFragment();
fragment. setArguments (bundle);
那Fragment如何向Activity傳遞資料呢?可以通過接口回調,定義好接口,在Fragment裡定義好後,在Activity裡可以通過Fragment調取。
思路如下:
在點選的時候,擷取目前上下文getActivity(),判斷它是否屬于(instanceof)宿主Activity,是的話把它轉化為宿主Activity,這樣的話得到宿主Activity就可以調用Activity裡的方法了,在方法裡,就可以實作切換Fragment了。
其實說到這裡,Activity向Fragment發送消息等也可以這樣用instanceof來判斷。
除了以上通信方式,還有廣播,EventBus等,SP,資料庫,靜态變量等。 Android問題 3: Activity四種啟動方式及應用場景 答案【答案不唯一,可自己衡量】: standard(預設)系統預設的啟動模式。
Android是使用傳回棧來管理活動的,在standard模式下,每當啟動一個新的活動,它就會在傳回棧中入棧,并處于棧頂的位置。
對于使用standard模式的活動,系統不會在乎這個活動是否已經在傳回棧中存在,而是每次啟動活動都會建立該活動的一個新的執行個體。
singleTopandroid:launchMode="singleTop"
當活動的啟動模式指定為singleTop,在啟動活動時,如果發現該傳回棧的棧頂已經是該活動時,則認為可以直接使用它,不會在建立新的活動執行個體
singleTask當活動的啟動模式指定為singleTask,每次啟動該活動時,首先會在傳回棧中檢查是否存在該活動的執行個體,如果發現已經存在就直接使用該執行個體,并把這個活動之上的所有活動統統出棧,如果沒有發現就會建立一個新的活動執行個體。
android:launchMode="singleTask"
singleInstance指定為singleInstance模式的活動會啟用一個新的傳回棧來管理這個活動,不管是哪個應用程式來通路這個活動,都共用的同一個傳回棧,解決了共享活動執行個體的問題
修改SecondActivity的啟動模式
android:launchMode="singleInstance"
使用方式:standard:怎麼樣都要建立
singleTop:頂上不是target Activity,new一個
singleTask:頂上不是target Activity,移除target之上的,把自己變成top。
singleInstance:開辟私有的task,完全獨立于程式的其他activity的task。
使用場景:standard:普通activity
singleTop:要展示推送過來的消息
singleTask:程式入口等啟動頁面
singleInstance:完全獨立的,類似鬧鐘的提示
Android問題 4: Activity橫豎屏切換及生命周期 答案【答案不唯一,可自己衡量】:1、不設定Activity的Android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次
2、設定Activity的android:configChanges=”orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時隻會執行一次
3、設定Activity的android:configChanges=”orientation|keyboardHidden|screenSize”時,切屏不會重新調用各個生命周期,隻會執行onConfigurationChanged方法。
Android問題 5: Android中的動畫 答案【答案不唯一,可自己衡量】:幀動畫:指通過指定每一幀的圖檔和播放時間,有序的進行播放而形成動畫效果,比如想聽的律動條。
補間動畫:指通過指定View的初始狀态、變化時間、方式,通過一系列的算法去進行圖形變換,進而形成動畫效果,主要有Alpha、Scale、Translate、Rotate四種效果。注意:隻是在視圖層實作了動畫效果,并沒有真正改變View的屬性,比如滑動清單,改變标題欄的透明度。
屬性動畫:在Android3.0的時候才支援,通過不斷的改變View的屬性,不斷的重繪而形成動畫效果。相比于視圖動畫,View的屬性是真正改變了。比如view的旋轉,放大,縮小。
Android問題 6: 廣播的兩種注冊方式 答案【答案不唯一,可自己衡量】:第一種是靜态注冊,也可成為常駐型廣播,這種廣播需要在Androidmanifest.xml中進行注冊,這中方式注冊的廣播,不受頁面生命周期的影響,即使退出了頁面,也可以收到廣播這種廣播一般用于想開機自啟動啊等等,由于這種注冊的方式的廣播是常駐型廣播,是以會占用CPU的資源。
第二種是動态注冊,而動态注冊的話,是在代碼中注冊的,這種注冊方式也叫非常駐型廣播,收到生命周期的影響,退出頁面後,就不會收到廣播,我們通常運用在更新UI方面。這種注冊方式優先級較高。最後需要解綁,否會會記憶體洩露。
Android問題 7: 有序廣播和無序廣播 答案【答案不唯一,可自己衡量】: 無序廣播通過Context.sendBroadcast()方法來發送,它是完全異步的。
所有的receivers(接收器)的執行順序不确定,是以所有的receivers(接收器)接收broadcast的順序不确定。
這種方式效率更高,但是BroadcastReceiver無法使用setResult系列、getResult系列及abortbroadcast(中止)系列API。
廣播不能被終止,資料不能被修改。
有序廣播:是通過Context.sendOrderedBroadcast來發送。所有的receiver依次執行。
BroadcastReceiver可以使用setResult系列函數來結果傳給下一個BroadcastReceiver,通過getResult系列函數來取得上個BroadcastReceiver傳回的結果,并可以abort系列函數來讓系統丢棄該廣播讓,使用該廣播不再傳送到别的BroadcastReceiver。
可以通過在intent-filter中設定android:priority屬性來設定receiver的優先級。優先級相同的receiver其執行順序不确定。
如果BroadcastReceiver是代碼中注冊的話,且其intent-filter擁有相同android:priority屬性的話,先注冊的将先收到廣播。
有序廣播,即從優先級别最高的廣播接收器開始接收,接收完了如果沒有丢棄,就下傳給下一個次高優先級别的廣播接收器進行處理,依次類推,直到最後。
Android問題 8: 什麼是本地廣播 答案【答案不唯一,可自己衡量】:為了簡單解決廣播的安全性問題,Android引入了一套本地廣播機制,使用這個機制發出的廣播隻能在程式的内部進行傳遞,隻能接受來自本應用程式發出的廣播。否則當我們發送一些攜帶關鍵資料的廣播可能被截獲,一些惡意程式也可能向我們的廣播接收器中發送各種垃圾廣播。
LocalBroadcastManager.getInstance(mContext)
Android問題 9: Service兩種啟動方式 答案【答案不唯一,可自己衡量】:服務不能自己運作,需要通過調用Context.startService()或Context.bindService()方法啟動服務。這兩個方法都 可以啟動Service,但是它們的使用場合有所不同。使用startService()方法啟用服務,調用者與服務之間沒有關連,即使調用者退出了,服 務仍然運作。使用bindService()方法啟用服務,調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的 特點。
如果打算采用Context.startService()方法啟動服務,在服務未被建立時,系統會先調用服務的onCreate()方法,接着調用onStart()方法和onStartCommand()方法。如果調用startService()方法前服務已經被建立,多次調用startService()方法并不會導緻多次建立服務,但會導緻多次調用onStart()方法。采用startService()方法啟動的服務,隻能調用Context.stopService()方法結束服務,服務結束時會調用onDestroy()方法。
Android問題 10: Service相關面試點陳述 答案【答案不唯一,可自己衡量】: Service和Thread有什麼關系一點關系也沒有,什麼是Service呢?在Android中它是四大元件之一,使用者是看不到的,也就是說并不與使用者産生UI互動,使用Service可以在背景執行長時間的操作;什麼是Thread?Thread是程式執行的最小機關,可以使用它來執行一些異步的操作。Thread可以肯定的是,它是獨立運作的,也就是說在A這個Activity你啟動了一個Thread,A這個Activity,finish之後,Thread如果沒有停止,或者run方法沒有執行完畢的話,那麼這個Thread是一直執行的,由于它是獨立運作的,再想辦法去控制這個Thread,那是不可能的,當然了你可以殺死程序。相比較來說,在Service去執行控制這個Thread,便能解決這個問題,因為任何Activ ity都可以控制同一個Service。
bindServicepublic abstract boolean bindService(Intent service, ServiceConnection conn, int flags);
第一個,Intent傳的值,第二個就是service連接配接對象
參數 flags的值有如下情況:
public static final int BIND_AUTO_CREATE 表明隻要綁定存在,就自動建立 Service;同時也告知Android系統,這個Service的重要程度與調用者相同, 除非考慮終止調用者,否則不要關閉這個Service
public static final int BIND_DEBUG_UNBIND
public static final int BIND_NOT_FOREGROUND
public static final int BIND_ABOVE_CLIENT
public static final int BIND_WAIVE_PRIORITY
IntentServiceIntentService 是繼承自 Service 并處理異步請求的一個類,在 IntentService 内有一個工作線程來處理耗時操作。
當任務執行完後,IntentService 會自動停止,不需要我們去手動結束。
如果啟動 IntentService 多次,那麼每一個耗時操作會以工作隊列的方式在 IntentService 的 onHandleIntent 回調方法中執行,依次去執行,使用串行的方式,執行完自動結束。