這是延續上一部分的知識,依然是面試題,進入正題:android
面試題一:談談你對Activity的理解:面試
這是考官但願你把本身的心得,作項目的時候的體會寫出來;咱們能夠答Activity異常被系統回收的時候怎麼處理的,而後能夠講講Activity的生命週期。json
面試題二:Service是否運行在主線程?可否在Service裏面執行耗時的操做?app
答:service是默認運行在主線程的,不少人以爲是後臺服務就以爲應該是在子線程,其實不是,因此咱們不能在裏面執行耗時的操做,由於會產生ANR異常。咱們要作耗時的操做要新開一個線程,處理耗時操做。異步
固然咱們也能夠指定service在指定線程中執行,通常咱們在配置清單文件的時候指定所在的線程:this
面試題三:兩個Activity之間怎麼傳遞數據?操作系統
答:若是是基本的數據類型,咱們能夠經過Intent 傳遞數據,也能夠經過intent putExtra傳遞一個bundle過來,其餘的intent想要獲取數據,能夠經過:線程
Bundle 相似map的集合對象
可是若是是複雜類型的話,咱們能夠在Application 全局裏面存放 對象 ,本身去實現本身的application的這個類,基礎系統的application ,每一個activity均可以取到 ,固然記得 清單文件裏面配置一下。接口
實現複雜類型的傳遞還能夠經過讓一個對象實現Serializable接口,實現了在各個接口後就能夠序列化到文件,具體實現過程是實例化一個FileOutputStream和一個ObjectOutputStream,而後經過對象輸出流向文件寫數據。咱們在另一個Activity經過對象 讀取這個對象數據,這樣就能實現了:
以上經過Serializable把對象序列化到文件而後讀取效率不高,入門若是是序列化到內存效率就高了,Google因而提供了parcelable接口,Parcelable 把對象序列化到android操做系統 的一塊公用的內存空間。
其實傳遞對象咱們還能夠用Gson,相似於json把對象按照必定格式打包成字符串,而後經過intent傳遞基本數據類型同樣再反序列化拿到數據:
而後咱們拿到這個str字符串,取單個對象:
取對象集合:
可是若是咱們要傳遞一個大文件的時候就不能用上面的方法了,由於效率過低,咱們就會傳遞一個引用過去,經過uri:
面試題四:怎麼在啓動一個Activity的時候啓動一個service?
咱們在OnCreate方法裏面new Intent(要啓動的service);而後startService(intent);。
面試題五:同一個程序,但不一樣的Activity是否能夠放在不一樣的Task任務棧中?
這是能夠的,咱們能夠在激活一個新的activity時候, 給intent設置flag:
Intent的flag添加FLAG_ACTIVITY_NEW_TASK singleinstance 單獨的任務棧
,而後這個新開的Activity棧就會在單獨的task棧裏面。
當咱們在開啓的時候就已經設置了開啓新的任務棧,拿咱們在Activity的onCreate方法裏面,即便還寫了開啓一個新任務棧,也不會重複開啓。
面試題五:Activity怎麼和Service綁定,怎麼在activity中啓動本身對應的service?
咱們在Service的不一樣方法裏面寫服務,效果不同的。
StartService()裏面的話,一旦被建立 調用着無關 無法使用service裏面的方法。
bindService () 把service 與調用者綁定 ,若是調用者被銷燬, service會銷燬。同時咱們也可使用裏面的方法,經過複寫裏面的bandService啓動服務:咱們須要寫一個本身的ServiceConnection對象MyConn,(重寫onServiceConnected和OnServiceDisconnected方法) 和BIND_AUTO_CREATE.:
面試題六:什麼是service,service的生命週期?怎麼啓動一個service,這些方法有啥區別,怎麼停用service?
在Service的生命週期中,由於沒有界面,被回調的方法比Activity少一些,只有onCreate, onStart, onDestroy,方法,由於是服務,因此有onBind和onUnbind方法。
一般有兩種方式啓動一個Service,他們對Service生命週期的影響是不同的。
1.經過startService
前面講過,StartService,沒有和調用者綁定在一塊兒,Service會經歷 onCreate 到onStart,而後處於運行狀態,stopService的時候調用onDestroy方法。
若是是調用者本身直接退出而沒有調用stopService的話,Service會一直在後臺運行。
2.經過bindService
這種方法是和調用者綁定在一塊兒的,Service會運行onCreate,而後是調用onBind,調用者退出了,Srevice就會調用onUnbind->onDestroyed方法。所謂綁定在一塊兒就共存亡了。調用者也能夠經過調用unbindService方法來中止服務,這時候Srevice就會調用onUnbind->onDestroyed方法。
可是幾個方法交織在一塊兒的話,會出現什麼狀況呢?
一個原則是Service的onCreate的方法只會被調用一次,就是你不管多少次的startService又bindService,Service只被建立一次。
若是先是bind了,那麼start的時候就直接運行Service的onStart方法,若是先是start,那麼bind的時候就直接運行onBind方法。
若是service運行期間調用了bindService,這時候再調用stopService的話,service是不會調用onDestroy方法的,service就stop不掉了,只能調用UnbindService, service就會被銷燬
若是一個service經過startService 被start以後,屢次調用startService 的話,service會屢次調用onStart方法。屢次調用stopService的話,service只會調用一次onDestroyed方法。
若是一個service經過bindService被start以後,屢次調用bindService的話,service只會調用一次onBind方法。
屢次調用unbindService的話會拋出異常。
面試題七:不用service,B頁面爲音樂播放,從A跳轉到B,再返回,如何使音樂繼續播放?
這個問題問得不太好,其實默認不作任何處理,B裏面的音樂都能播放.
遇到問題, 能夠隨機應變,靈活發揮,多考慮些細節,好比說這個題就能夠這樣說,說說你對startActivityForResult的理解()
A開啓B的時候,用startActivityForResult()方法, B返回的時候把播放的狀態信息返回給A ,A繼續播放音樂.
面試題八:什麼是IntentService?有何優勢?
簡單來說相對於通常service他本身開了一個thread,咱們在OnHandleIntent()裏面處理耗時的操做。它是Sdk給咱們提供的方便的,帶有異步處理的service類,異步處理的方法 OnHandleIntent()。每次執行OnHandleIntent方法,都回開啓一個不一樣的線程。
面試題九:何時使用Service?
前臺進程優先級最高,最難被殺死,service只比前臺進程優先級第一點,用service能讓咱們在後臺運行的進程不容易掛掉。
1. 若是service正在調用onCreate, onStartCommand或者onDestory方法,那麼用於當前service的進程至關於前臺進程以免被killed。
2. 若是當前service已經被啓動(start),擁有它的進程則比那些用戶可見的進程優先級低一些,可是比那些不可見的進程更重要,這就意味着service通常不會被killed.
3.若是一個前臺進程同時又綁定到了service上,那這個進程優先級最高。能夠理解爲,service是可見的。
4. 若是service可使用startForeground(true)方法來將service設置爲前臺狀態,至關於強行提升了這個service的優先級,那麼系統就認爲是對用戶可見的,並不會在內存不足時killed。
那service用在哪裏呢?
1.Service的特色可讓他在後臺一直運行,能夠在service裏面建立線程去完成耗時的操做. 天氣預報 widget TimerTask Timer 按期執行timertask。
2.Broadcast receiver捕獲到一個事件以後,能夠起一個service來完成一個耗時的操做. Broadcast receiver生命週期 和 響應時間很短,只有10秒,沒執行完的話就沒有執行了。