Android 面試題(二)Android基礎篇

前言

“有人覺得自己不找工作,不需要看面試題,真的是這樣嗎?試想?如果你一直待在一家公司,都不知道外面的情況如何的話,那是很可怕的,至少我這麼認爲。看面試題的目的不一定要跳槽,而是知道自己的優缺點是什麼,知道市場需要什麼樣的人,只有這樣才能和社會接上軌跡!”

1、Android點擊應用圖標如何啓動APP?

  • 1.點擊應用圖標後會去啓動應用的LauncherActivity。

  • 2.如果LauncherActivity所在進程沒有創建,就會創建新進程(以Socket形式通知Zygote進程去fork新進程)。

  • 3.整體的流程就是Activity的啓動流程。

2、Activity四種啓動模式

  • 1.standard 默認模式,可以不用寫配置。在這個模式下,都會默認創建一個新的實例。因此,在這種模式下,可以有多個相同的實例,也允許多個相同Activity疊加。

  • 2.singleTop 可以有多個實例,但是不允許多個相同Activity疊加。即,如果Activity在棧頂的時候,啓動相同的Activity,不會創建新的實例,而會調用其onNewIntent方法。

  • 3.singleTask 只有一個實例。在同一個應用程序中啓動他的時候,若Activity不存在,則會在當前task創建一個新的實例,若存在,則會把task中在其之上的其它Activity destory掉並調用它的onNewIntent方法。

  • 4.singleInstance 只有一個實例,並且這個實例獨立運行在一個task中,這個task只有這個實例,不允許有別的Activity存在。

3、Android橫豎屏切換activity生命週期?

橫豎屏切換根據Android系統版本會有差異,具體細節請參考:Activity橫豎屏切換生命週期詳解

  • 1.AndroidManifest.xml不設置Activity的android:configChanges時,切屏會重新調用各個生命週期,
    切橫屏時會執行一次,切豎屏時會執行兩次。生命週期如下:
    onSaveInstanceState-onPause-onStop-onDestory-onCreate-onStart-onRestoreInstanceState-onResume
  • 2.設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命週期,切橫、豎屏時只會執行一次。生命週期如下:onSaveInstanceState-onPause-onStop-onDestory-onCreate-onStart-onRestoreInstanceState-onResume
  • 3.設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命週期,只會執行onConfigurationChanged方法。

4、PathClassLoader和DexClassLoader的區別?

  • 1.PathClassLoader: 只能加載安裝到Android系統的APK,即/data/data目錄,是Android默認的類加載器。

  • 2.DexClassLoader: 可以加載任意目錄下的dex、jar、apk、zip文件。

5、Android中Intent傳遞數據的大小限制?如何解決該問題?

  • 1.大小限制大約是1MB:超過該限制可能導致 OOM。
  • 2.解決辦法
    • 進程內:EventBus、文件緩存
    • 進程間:通過ContentProvider進行進程間數據共享和傳遞。

總結:不要通過 Intent 在 Android 基礎組件之間傳遞大數據(binder transaction 緩存爲1MB)

6、Android有哪些Context的相關類?

  • 1.Context抽象類

  • 2.ContextImpl:Context的實現類

  • 3.ContextWrapper:Context的包裝類(內部是ContextImpl),Applicaiton、Activity、Service都間接或者直接繼承自ContextWrapper

7、IntentService和Service有什麼區別?

  • 1.Service不是獨立的進程,也不是獨立的線程,它是依賴於應用程序的主線程(比喻成沒有界面的activity),也就是說,在更多時候不建議在Service中編寫耗時的邏輯和操作,否則會引起ANR。
  • 2.IntentService是Service的子類,IntentService在執行onCreate操作的時候,內部開了一個線程,去你執行你的耗時操作。通過Handler looper message的方式實現了一個多線程的操作,同時耗時操作也可以被這個線程管理和執行,同時不會產生ANR的情況。

8、Service啓動方式和對應的生命週期以及區別?

  • 1.startService(onCreate-onStartCommand-onDestory)
    服務與啓動者沒有必然聯繫,啓動者銷燬,服務也可以存在;除非主動調用StopService方法來停止服務。
  • 2.bindService(onCreate-onBind-onUnbind-onDestory)
    服務與啓動者相互關聯,啓動者銷燬,那麼服務也會跟着銷燬;比如activityA中bind服務,然後activityB中也在使用該服務,一旦activityA銷燬那麼服務也會銷燬,這個時候activityB中服務也就沒用了,除非再bind一次。
  • 3.startService之後再bindService這樣避免宿主死亡之後service跟着被銷燬。

9、BroadcastReceiver有哪幾種類型?

  • 無序廣播:無序廣播類似於電視臺播放新聞聯播,不管你當時有沒有準時收看,都會按時播放新聞聯播。

    發送方式:通過sendBroadcast(intent)發送
    特點:①無法終止廣播 ②無法修改數據

  • 有序廣播:有序廣播就類似於中央發送的紅頭文件,比如說會首先發送到哪個省,然後發送到哪個市等等,按照優先級一級一級的進行接收,就比如中央給每個村民發送1千斤大米。

    發送方式:通過sendOrderedBroadcast()發送
    特點:①可以終止廣播 ②可以修改數據

  • 粘性廣播:特定是Intent會一直保留到廣播事件結束,沒有10s限制。一般用來確保重要的狀態改變後的信息被持久保存,並且能隨廣播給新的BroadcastReceiver,比如電源的改變。
    發送方式:通過SendStickyBroadcast()發送。

10、Android有哪些進程?

  • 1.前臺進程: 用戶當前操作所必須的進程
  • 2.可見進程:沒有任何前臺組件,但是任輝影響屏幕上可見內容的進程。
  • 3.服務進程:正在運行服務(該服務通過startService()啓動),且不屬於上面兩者的進程。
  • 4.後臺進程:包含目前對用戶不可兼得Activity的進程。
  • 5.空進程:不包含任何活動組件的進程。

11、Android進程和線程的區別

  • 1.進程是資源管理的最小單位,線程是程序執行的最小單位。
  • 2.每個進程都有自己的數據段、代碼段和堆棧段。線程通常叫做輕型的進程。它包含獨立的棧和cpu寄存狀態,每個線程共享其所附屬進程的所有資源,包含打開的文件,內存頁面,信號標識以及分配內存等。
  • 3.線程比進程花費更小的CPU資源。
  • 4.在操作系統設計上,從進程演化出線程,最主要的目的就是更好的支持多處理器,並且減少進程上下文切換的開銷。
  • 5.線程和進程的關係是:①線程屬於進程②線程運行在進程空間內③同一進程所產生的線程共享同一內存空間,當進程退出所產生的的線程會被強制退出並清除④一個進程至少需要一個線程來作爲它的指令執行體⑤進程管理着資源(比如CPU,內存,文件等),將線程分配到某個CPU運行。
  • 6.線程按照其調度這可分爲用戶級線程和內核級線程兩種。
  • 7.用戶級線程要綁定內核級線程使用。
  • 8.默認情況下不能保證新線程和調用線程的執行順序。
  • 9.每個進程內部的不同線程都有自己的唯一標識(ID),線程標識只在它所屬的進程環境中有效。
  • 10.Sleep線程告訴系統,自己在一段時間內不被調度。

12、Android線程間通信有哪些方式?

  • 1.接口

  • 2.Handler機制

  • 3.觀察者模式(EventBus)

  • 4.Android使用RunonUiThread可以切換到主線程

  • 5.AsyncTask機制

  • 6.BroadCast

13、Android進程間通信有哪些方式?

  • 1.Bundle,可以在一個進程中通過Intent將攜帶數據的Bundle發送到另一個進程的組件。

  • 2.ContentProvider,多個App共享數據

  • 3.AIDL(Android Interface Define Language)服務,客戶端定義接口暴露給服務端使用

  • 4.BroadCast

  • 5.Socket

14、如何進行進程保活

  • 1.提升進程優先級,降低進程被殺死的概率。

  • 2.拉活已經被殺死的進程。

    ● 利用廣播拉活Activity

    ● 手機去監聽系統廣播:如開機廣播,鎖屏解鎖廣播等。

15、什麼 是序列號和反序列化?

  • 1.序列化:將數據結構或對象轉換成二進制的過程

  • 2.反序列化:將在序列化過程中生成的二進制串轉換成數據結構或對象的過程

16、Serializable和Parcelable的區別

  • 1.Serilizable是java實現的一套序列化方法,會觸發頻繁的IO操作,效率較低,適合將對象存儲到磁盤上的情況。
  • 2.Parcelable是Android提供的序列化方法。Parcelable將序列化後的字節流寫入到一個共享內存中,其他對象可以從該共享內存中讀出字節流,並反序列化成對象,效率較高,適合對象間和進程間傳遞信息。

17、64k問題的產生原因和如何解決?

  • 1.產生原因:Dex文件中class、method的索引使用short類型,因此如果方法、類的總數超過了2字節的short-65535就會出問題。

  • 2.解決辦法:使用Google的Multidex

18、Android 中的動畫有哪些?

  • 1.幀動畫 指通過指定的每一幀的圖片和播放時間,有序的進行播放的動畫效果。
  • 2.補間動畫 指通過指定View的初始狀態、變化時間、移動距離等方式實現的動畫效果。
    屬性有scale、alpha、Translate、Rotate
    注意:只是在視圖層實現了動畫效果,並沒有真正改變View的屬性。
  • 3.屬性動畫 屬性動畫,通過不斷地改變View的屬性,不斷重繪而形成動畫效果。
    相比較視圖動畫,View的屬性是真正改變。

附:Android基礎思維導圖

在這裏插入圖片描述

更多精彩文章,請關注:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章