1549頁Android最新面試題含答案

在今年年初的疫情中,成了失業人員之一,因而各類準備面試,發現面試題網上不少,可是都是很凌亂的,並且一個地方一點,沒有一個系統的面試題庫,有題庫有的沒有答案或者是答案很簡潔,沒有達到面試的要求。因此一直想系統的整理一份面試題。java

最近終於得閒花了將近一個月的時間整理了一份面試題庫。這些面試題,包括我本人本身去面試遇到的,還有其餘人員去面試遇到的,我都統一的整理了一下,但願對你們有用。做者不易,若有錯誤望見諒。android

1、java面試題(基礎+進階)(必須)

1.java中==和equals和hashCode的區別

==是運算符,用來比較兩個值、兩個對象的內存地址是否相等;
equals是Object類的方法,默認狀況下比較兩個對象是不是同一個對象,內部實現是經過「==」來實現的。
若是想比較兩個對象的其餘內容,則能夠經過重寫equals方法,
hashCoed也是Object類裏面的方法,返回值是一個對象的哈希碼,同一個對象哈希碼必定相等,但不一樣對象哈希碼也有可能相等。
一、若是兩個對象equals,Java運行時環境會認爲他們的hashcode必定相等。
二、若是兩個對象不equals,他們的hashcode有可能相等。
三、若是兩個對象hashcode相等,他們不必定equals。
四、若是兩個對象hashcode不相等,他們必定不equals。git

2.int、char、long各佔多少字節數(筆試題多出現)

Int:4字節 chat:2字節 long\double:8字節程序員

3.int與integer的區別 (筆試)

一、Integer是int的包裝類,int則是java的一種基本數據類型
二、Integer變量必須實例化後才能使用,而int變量不須要
三、Integer實際是對象的引用,當new一個Integer時,其實是生成一個指針指向此對象;而int則是直接存儲數據值
四、Integer的默認值是null,int的默認值是0github

4.談談對java多態的理解

多態是指:父類引用指向子類對象,在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。(同一消息能夠根據發送對象的不一樣而採用多種不一樣的行爲方式。面試

多態的做用:消除類型之間的耦合關係。算法

實現多態的技術稱爲:動態綁定(dynamic binding),是指在執行期間判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。數據庫

實現多態的三要素:繼承,重寫,父類引用指向子類對象(即,聲明是父類,實際指向的是子類的一個對象)瀏覽器

5.String、StringBuffer、StringBuilder區別

一、三者在執行速度上:StringBuilder > StringBuffer > String (因爲String是常量,不可改變,拼接時會從新建立新的對象)。
二、StringBuffer是線程安全的,StringBuilder是線程不安全的。(因爲StringBuffer有緩衝區)緩存

6.什麼是內部類?內部類的做用

內部類:將一個類定義在另外一個類裏面或者一個方法裏面,這樣的類稱爲內部類。
做用:1.每一個內部類都能獨立的繼承一個接口的實現,因此不管外部類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響。內部類使得多繼承的解決方案變得完整,   
2.方便將存在必定邏輯關係的類組織在一塊兒,又能夠對外界隱藏。   
3.方便編寫事件驅動程序   
4.方便編寫線程代碼

7.抽象類和接口區別

相同:
一、都能被繼承
二、繼承的類都必須將未實現的函數實現
三、只關注方法的定義,不關注方法的實現
差別:
一、一個子類能夠繼承多個接口,可是隻能繼承一個父類
二、抽象類在對象中只能表示一種對象,接口能夠被不少對象繼承

8.抽象類與接口的應用場景

若是你擁有一些方法而且想讓它們中的一些有默認實現,那麼使用抽象類吧。
若是你想實現多重繼承,那麼你必須使用接口。因爲Java不支持多繼承,子類不可以繼承多個類,但能夠實現多個接口。所以你就可使用接口來解決它。
若是基本功能在不斷改變,那麼就須要使用抽象類。若是不斷改變基本功能而且使用接口,那麼就須要改變全部實現了該接口的類。

9.抽象類是否能夠沒有方法和屬性?

抽象類專用於派生出子類,子類必須實現抽象類所聲明的抽象方法,不然,子類還是抽象類。
包含抽象方法的類必定是抽象類,但抽象類中的方法不必定是抽象方法。
抽象類中能夠沒有抽象方法,但有抽象方法的必定是抽象類。因此,java中 抽象類裏面能夠沒有抽象方法。 抽象類的做用在於子類對其的繼承和實現,也就是多態;而沒有抽象方法的抽象類的存在價值在於:實例化了沒有意義,由於類已經定義好了,不能改變其中的方法體,可是實例化出來的對象卻知足不了要求,只有繼承並重寫了他的子類才能知足要求。因此才把它定義爲沒有抽象方法的抽象類

10.泛型中extends和super的區別

一、< extends T>限定參數類型的上界:參數類型必須是T或T的子類型
限定參數類型的下界:參數類型必須是T或T的超類型
二、 只能用於方法返回,告訴編譯器此返參的類型的最小繼承邊界爲T,T和T的父類都能接收,可是入參類型沒法肯定,只能接受null的傳入
只能用於限定方法入參,告訴編譯器入參只能是T或其子類型,而返參只能用Object類接收既不能用於入參也不能用於返參

11.父類的靜態方法可否被子類重寫

不能,父類的靜態方法可以被子類繼承,可是不可以被子類重寫,即便子類中的靜態方法與父類中的靜態方法徹底同樣,也是兩個徹底不一樣的方法。

12.進程和線程的區別(問的蠻多的,回答的時候用口語說出來,不要背書)

進程是cpu資源分配的最小單位,線程是cpu調度的最小單位。
進程之間不能共享資源,而線程共享所在進程的地址空間和其它資源。
一個進程內可擁有多個線程,進程可開啓進程,也可開啓線程。
一個線程只能屬於一個進程,線程可直接使用同進程的資源,線程依賴於進程而存在。

13.final,finally,finalize的區別

final:修飾類、成員變量和成員方法,類不可被繼承,成員變量不可變,成員方法不可重寫
finally:與try...catch...共同使用,確保不管是否出現異常都能被調用到
finalize:類的方法,垃圾回收以前會調用此方法,子類能夠重寫finalize()方法實現對資源的回收

14.Serializable 和Parcelable 的區別

Serializable Java 序列化接口 在硬盤上讀寫 讀寫過程當中有大量臨時變量的生成,內部執行大量的i/o操做,效率很低。

Parcelable Android 序列化接口 效率高 使用麻煩 在內存中讀寫(AS有相關插件 一鍵生成所需方法) ,對象不能保存到磁盤中。

15.靜態屬性和靜態方法是否能夠被繼承?是否能夠被重寫?以及緣由?

可繼承 不可重寫 而是被隱藏
若是子類裏面定義了靜態方法和屬性,那麼這時候父類的靜態方法或屬性稱之爲"隱藏"。若是你想要調用父類的靜態方法和屬性,直接經過父類名.方法或變量名完成。

16.成員內部類、靜態內部類、局部內部類和匿名內部類的理解,以及項目中的應用

java中內部類主要分爲成員內部類、局部內部類(嵌套在方法和做用域內)、匿名內部類(沒構造方法)、靜態內部類(static修飾的類,不能使用任何外圍類的非static成員變量和方法, 不依賴外圍類)
使用內部類最吸引人的緣由是:每一個內部類都能獨立地繼承一個(接口的)實現,因此不管外圍類是否已經繼承了某個(接口的)實現,對於內部類都沒有影響。
由於Java不支持多繼承,支持實現多個接口。但有時候會存在一些使用接口很難解決的問題,這個時候咱們能夠利用內部類提供的、能夠繼承多個具體的或者抽象的類的能力來解決這些程序設計問題。能夠這樣說,接口只是解決了部分問題,而內部類使得多重繼承的解決方案變得更加完整。

17.string 轉換成 integer的方式及原理

String —>integer Intrger.parseInt(string);
Integer—> string Integer.toString();
原理:
parseInt(String s)--內部調用parseInt(s,10)(默認爲10進制)
正常判斷null,進制範圍,length等
判斷第一個字符是不是符號位
循環遍歷肯定每一個字符的十進制值
經過*= 和-= 進行計算拼接
判斷是否爲負值 返回結果。

18.哪些狀況下的對象會被垃圾回收機制處理掉?

1.全部實例都沒有活動線程訪問。
2.沒有被其餘任何實例訪問的循環引用實例。
3.Java 中有不一樣的引用類型。判斷實例是否符合垃圾收集的條件都依賴於它的引用類型。
要判斷怎樣的對象是沒用的對象。這裏有2種方法:
1.採用標記計數的方法:
給內存中的對象給打上標記,對象被引用一次,計數就加1,引用被釋放了,計數就減一,當這個計數爲0的時候,這個對象就能夠被回收了。固然,這也就引起了一個問題:循環引用的對象是沒法被識別出來而且被回收的。因此就有了第二種方法:
2.採用根搜索算法:
從一個根出發,搜索全部的可達對象,這樣剩下的那些對象就是須要被回收的

19.靜態代理和動態代理的區別,什麼場景使用?

由程序員建立或由特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。動態代理類:在程序運行時,運用反射機制動態建立而成。
場景:著名的Spring框架、Hibernate框架等等都是動態代理的使用例子

20.Java的異常體系

Throwable,Error,Exception

21.談談你對解析與分派的認識。

解析:Java中方法調用的目標方法在Class文件裏面都是常量池中的符號引用,在類加載的解析階段,會將其中的一部分符號引用轉化爲直接引用。這種解析的前提是:方法在程序真正運行以前就有一個能夠肯定的調用版本,而且這個方法的調用版本在運行期是不可改變的,即「編譯期可知,運行期不可變」,這類目標的方法的調用稱爲解析(Resolve)。

只要能被invokestatic和invokespecial指令調用的方法,均可以在解析階段中肯定惟一的調用版本,符合條件的有靜態方法(invokestatic指令)、私有方法、實例構造方法、父類方法(這3個是invokespecial指令),它們在類加載的的解析階段就會將符號引用解析爲該方法的直接引用。
分派:分派是多態性的體現,Java虛擬機底層提供了咱們開發中「重載」(Overload)「和重寫」(Override)的底層實現。其中重載屬於靜態分派,而重寫則是動態分派的過程。
解析調用必定是個靜態的過程,在編譯期就徹底肯定,在類加載的解析階段就將涉及的符號引用所有轉變爲能夠肯定的直接引用,不會延遲到運行期再去完成。

22.Java中實現多態的機制是什麼?

答:方法的重寫Overriding和重載Overloading是Java多態性的不一樣表現
重寫Overriding是父類與子類之間多態性的一種表現
重載Overloading是一個類中多態性的一種表現.

23.說說你對Java反射的理解

JAVA反射機制是在運行狀態中, 對於任意一個類, 都可以知道這個類的全部屬性和方法; 對於任意一個對象, 都可以調用它的任意一個方法和屬性。 從對象出發,經過反射(Class類)能夠取得取得類的完整信息(類名 Class類型,所在包、具備的全部方法 Method[]類型、某個方法的完整信息(包括修飾符、返回值類型、異常、參數類型)、全部屬性 Field[]、某個屬性的完整信息、構造器 Constructors),調用類的屬性或方法本身的總結: 在運行過程當中得到類、對象、方法的全部信息。

24.說說你對Java註解的理解

元註解
元註解的做用就是負責註解其餘註解。java5.0的時候,定義了4個標準的meta-annotation類型,它們用來提供對其餘註解的類型做說明。
1.@Target
2.@Retention
3.@Documented
4.@Inherited

因爲篇幅有限,只能分享部分面試題,更多面試題及答案能夠個人【Github】閱讀下載哦~無償分享給你們,算是一個感恩回饋吧


2、Android面試題(基礎+進階)(必須)

1.四大組件是什麼(這個不知道的話,不必去面試了,轉行吧)

Android四大組件有Activity,Service服務,Content Provider內容提供,BroadcastReceiver。

2.四大組件的生命週期和簡單用法

activity:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDetroy()

Service:
service 啓動方式有兩種,一種是經過startService()方式進行啓動,另外一種是經過bindService()方式進行啓動。不一樣的啓動方式他們的生命週期是不同.
經過startService()這種方式啓動的service,生命週期是這樣:調用startService() --> onCreate()--> onStartConmon()--> onDestroy()。這種方式啓動的話,須要注意一下幾個問題,第一:當咱們經過startService被調用之後,屢次在調用startService(),onCreate()方法也只會被調用一次,而onStartConmon()會被屢次調用當咱們調用stopService()的時候,onDestroy()就會被調用,從而銷燬服務。第二:當咱們經過startService啓動時候,經過intent傳值,在onStartConmon()方法中獲取值的時候,必定要先判斷intent是否爲null。

經過bindService()方式進行綁定,這種方式綁定service,生命週期走法:bindService-->onCreate()-->onBind()-->unBind()-->onDestroy() bingservice 這種方式進行啓動service好處是更加便利activity中操做service,好比加入service中有幾個方法,a,b ,若是要在activity中調用,在須要在activity獲取ServiceConnection對象,經過ServiceConnection來獲取service中內部類的類對象,而後經過這個類對象就能夠調用類中的方法,固然這個類須要繼承Binder對象

contentProvider:contentProvider的生命週期、理解應該跟進程同樣,它做爲系統應用組件、其生命週期應該跟app應用的生命週期相似,只是它屬於系統應用、因此隨系統啓動而初始化,隨系統關機而結束;但也存在其餘狀態下結束進程、好比說系統內存不夠時,進行內存回收、會根據生成時間態、用戶操做等狀況進行是否內存回收。

BroadcastReceiver:廣播的生命週期從調用開始到onReceiver執行完畢結束,須要注意的是,通常廣播的生命週期都極短,須要在10s內處理完onReceiver中的全部工做,因此,通常不進行耗時長的工做,若是有耗時長的工做,應當經過Intent傳遞給Service進行處理。(注意,不要在onReceiver中開啓線程進行耗時任務處理,不然,在10s後,該線程會變成空線程,從而致使任務的丟失。一樣的,也不要使用bindService來綁定服務。)
值得注意的是,若是是在代碼中動態註冊的廣播,如:在Activity註冊,那麼在Activity的onDestory中須要使用unregisterReceiver註銷廣播。

3.Activity之間的通訊方式

Intent
藉助類的靜態變量
藉助全局變量/Application
藉助外部工具
藉助SharedPreference
使用Android數據庫SQLite
赤裸裸的使用File
Android剪切板
藉助Service

4.橫豎屏切換的時候,Activity 各類狀況下的生命週期

分兩種狀況:
1.不設置Activity的android:configChanges,或設置Activity的android:configChanges="orientation",或設置Activity的android:configChanges="orientation|keyboardHidden",切屏會從新調用各個生命週期,切橫屏時會執行一次,切豎屏時會執行一次。
橫豎屏切換形成 activity 的生命週期
onPause()-onSaveInstanceState()-onStop()-onDestroy()-onCreat()-onStart()-onRestoreInstanceState()-onResume()即會致使 activity 的銷燬和重建 。

2.配置 android:configChanges="orientation|keyboardHidden|screenSize",纔不會銷燬 activity,且只調用 onConfigurationChanged方法。
onSaveInstanceState() 與onRestoreIntanceState() 資源相關的系統配置發生改變或者資源不足時(例如屏幕旋轉),當前 Activity 會銷燬,而且在 onStop 以前回調 onSaveInstanceState 保存數據,在從新建立 Activity 的時候在onStart 以後回調 onRestoreInstanceState。其中 Bundle 數據會傳到 onCreate(不必定有數據)和 onRestoreInstanceState(必定有數據)。
用戶或者程序員主動去銷燬一個 Activity 的時候不會回調(如代碼中 finish()或用戶按下 back,不會回調),其餘狀況都會調用,來保存界面信息。

5.Activity與Fragment之間生命週期比較

a. 在建立的過程當中,是 Activity 帶領 Fragment 執行生命週期的方法,因此它們生命週期執行的順序以下:

Activity -- onCreate() ,
Fragment -- onAttach() -> onCreate() -> onCreateView() -> onActivityCreated



Activity -- onStart()

Fragment -- onStart()


Activity -- onResume()

Fragment -- onResume()


最後,在銷燬時是 Fragment 帶領 Activity 執行生命週期的方法:

Fragment -- onPause()

Activity -- onPause()


Fragment -- onStop()

Activity -- onStop()


Fragment -- onDestroyView() -> onDestroy() -> onDetach()

Activity -- onDestroy()

6.Activity上有Dialog的時候按Home鍵時的生命週期

有 Dialog 和 無 Dialog 按 Home 鍵效果同樣:

正常啓動: onCreate() -> onStart() -> onResume()
按 home 鍵: onPause() -> onStop()
再次啓動: onRestart() -> onStart() -> onResume()

7.兩個Activity 之間跳轉時必然會執行的是哪幾個方法?

a. 正常狀況下 Activity A 跳轉到 Activity B 時:
A調用 onCreate() 方法 -> onStart() 方法 -> onResume() 方法,此時 A 前臺可見。當 A 跳轉到 B 時,A 調用 onPause() 方法,而後調用新的 Activity B 中的 onCreate() 方法 -> onStart() 方法 -> onResume() 方法。最後 A 再調用onStop()方法。
b. 當 Activity B 爲透明主題時:
除了最後 Activity A 不調用 onStop() 方法以外,其它都和 a 中的同樣。

8.Activity的四種啓動模式對比

此處延伸:棧(First In Last Out)與隊列(First In First Out)的區別
區別:隊列先進先出,棧先進後出
對插入和刪除操做的"限定"。 棧是限定只能在表的一端進行插入和刪除操做的線性表。 隊列是限定只能在表的一端進行插入和在另外一端進行刪除操做的線性表。
遍歷數據速度不一樣

standard 模式

這是默認模式,每次激活Activity時都會建立Activity實例,並放入任務棧中。使用場景:大多數Activity。

singleTop 模式

若是在任務的棧頂正好存在該Activity的實例,就重用該實例( 會調用實例的 onNewIntent() ),不然就會建立新的實例並放入棧頂,即便棧中已經存在該Activity的實例,只要不在棧頂,都會建立新的實例。使用場景如新聞類或者閱讀類App的內容頁面。

singleTask 模式

若是在棧中已經有該Activity的實例,就重用該實例(會調用實例的 onNewIntent() )。重用時,會讓該實例回到棧頂,所以在它上面的實例將會被移出棧。若是棧中不存在該實例,將會建立新的實例放入棧中。使用場景如瀏覽器的主界面。無論從多少個應用啓動瀏覽器,只會啓動主界面一次,其他狀況都會走onNewIntent,而且會清空主界面上面的其餘頁面。

singleInstance 模式

在一個新棧中建立該Activity的實例,並讓多個應用共享該棧中的該Activity實例。一旦該模式的Activity實例已經存在於某個棧中,任何應用再激活該Activity時都會重用該棧中的實例( 會調用實例的 onNewIntent() )。其效果至關於多個應用共享一個應用,無論誰激活該 Activity 都會進入同一個應用中。使用場景如鬧鈴提醒,將鬧鈴提醒與鬧鈴設置分離。singleInstance不要用於中間頁面,若是用於中間頁面,跳轉會有問題,好比:A -> B (singleInstance) -> C,徹底退出後,在此啓動,首先打開的是B。

9.Activity狀態保存於恢復

當 Activity 在異常狀況( 系統內存不足或者系統配置發生了改變等 )被銷燬重建後, 在銷燬的時候 Activity 會調用 onSaveInstanceState() 方法用於保存 Activity 相關的狀態和數據,而後在重建後的 Activity 的中咱們能夠經過 onCreate() 或者 onRestoreInstanceState() 方法恢復數據,這裏咱們須要注意的是若是經過 onCreate() 方法恢復,那麼得先判斷它的 intent 參數 是否爲空,若是在 onRestoreInstanceState() 方法恢復就不會,由於只要 onRestoreInstanceState() 方法被調用就說明必定有數據,不會爲空。Google 推薦使用 onRestoreInstanceState() 方法。

10.如何實現Fragment的滑動?

將Fragment與viewpager綁定,經過viewpager中的touch事件,會進行move事件的滑動處理。

11.fragment之間傳遞數據的方式?

一、在fragment中設置一個方法,而後進行調用
二、採起接口回調的方式進行數據傳遞。
三、廣播或者是使用三方開源框架:EventBus

12.Activity 怎麼和Service 綁定?怎麼在Activity 中啓動本身對應的Service?

一、activity能進行綁定得益於Serviece的接口。爲了支持Service的綁定,實現onBind方法。
二、Service和Activity的鏈接能夠用ServiceConnection來實現。須要實現一個新的ServiceConnection,重現onServiceConnected和OnServiceDisconnected方法,一旦鏈接創建,就能獲得Service實例的引用。
三、執行綁定,調用bindService方法,傳入一個選擇了要綁定的Service的Intent(顯示或隱式)和一個你實現了的ServiceConnection的實例

13.service和activity怎麼進行數據交互?

1.經過 broadcast:經過廣播發送消息到 activitry
2.經過 Binder:經過與 activity 進行綁定
(1)添加一個繼承 Binder 的內部類,並添加相應的邏輯方法。
(2)重寫 Service 的 onBind 方法,返回咱們剛剛定義的那個內部類實例。
(3)Activity 中建立一個 ServiceConnection 的匿名內部類,而且 重 寫 裏 面 的 onServiceConnected 方 法 和onServiceDisconnected 方法,這兩個方法分別會在活動與服務成功綁定以及解除綁定的時候調用(在onServiceConnected方法中,咱們能夠獲得一個剛纔那個 service 的 binder 對象,經過對這個 binder 對象進行向下轉型,獲得咱們那個自定義的 Binder 實例,有了這個實例,作能夠調用這個實例裏面的具體方法進行須要的操做了)。

14.Service的開啓方式,請描述一下Service 的生命週期,請描述一下Service 的生命週期

service 啓動方式有兩種,一種是經過startService()方式進行啓動,另外一種是經過bindService()方式進行啓動。不一樣的啓動方式他們的生命週期是不同.
經過startService()這種方式啓動的service,生命週期是這樣:調用startService() --> onCreate()--> onStartConmon()--> onDestroy()。這種方式啓動的話,須要注意一下幾個問題,第一:當咱們經過startService被調用之後,屢次在調用startService(),onCreate()方法也只會被調用一次,而onStartConmon()會被屢次調用當咱們調用stopService()的時候,onDestroy()就會被調用,從而銷燬服務。第二:當咱們經過startService啓動時候,經過intent傳值,在onStartConmon()方法中獲取值的時候,必定要先判斷intent是否爲null。
經過bindService()方式進行綁定,這種方式綁定service,生命週期走法:bindService-->onCreate()-->onBind()-->unBind()-->onDestroy() bingservice 這種方式進行啓動service好處是更加便利activity中操做service,好比加入service中有幾個方法,a,b ,若是要在activity中調用,在須要在activity獲取ServiceConnection對象,經過ServiceConnection來獲取service中內部類的類對象,而後經過這個類對象就能夠調用類中的方法,固然這個類須要繼承Binder對象

15.請描述一下廣播BroadcastReceiver的理解

廣播,是一個全局的監聽器,屬於Android四大組件之一。Android 廣播分爲兩個角色:廣播發送者、廣播接收者。做用是監聽 / 接收 應用 App 發出的廣播消息,並 作出響應
可應用在:
Android不一樣組件間的通訊(含 :應用內 / 不一樣應用之間)
多線程通訊
與 Android 系統在特定狀況下的通訊
如:電話呼入時、網絡可用時

16.Broadcast註冊方式與區別 (此處延伸:什麼狀況下用動態註冊)

Broadcast廣播,註冊方式主要有兩種.
第一種是靜態註冊,也可成爲常駐型廣播,這種廣播須要在Androidmanifest.xml中進行註冊,這中方式註冊的廣播,不受頁面生命週期的影響,即便退出了頁面,也能夠收到廣播這種廣播通常用於想開機自啓動啊等等,因爲這種註冊的方式的廣播是常駐型廣播,因此會佔用CPU的資源。
第二種是動態註冊,而動態註冊的話,是在代碼中註冊的,這種註冊方式也叫很是駐型廣播,收到生命週期的影響,退出頁面後,就不會收到廣播,咱們一般運用在更新UI方面。這種註冊方式優先級較高。最後須要解綁,否會會內存泄露
廣播是分爲有序廣播和無序廣播。

17.本地廣播和全局廣播有什麼差異?

BroadcastReceiver是針對應用間、應用與系統間、應用內部進行通訊的一種方式
LocalBroadcastReceiver僅在本身的應用內發送接收廣播,也就是隻有本身的應用能收到,數據更加安全廣播只在這個程序裏,並且效率更高。

18.BroadcastReceiver,LocalBroadcastReceiver 區別

1、應用場景不一樣
一、BroadcastReceiver用於應用之間的傳遞消息;
二、而LocalBroadcastManager用於應用內部傳遞消息,比broadcastReceiver更加高效。
2、使用安全性不一樣
一、BroadcastReceiver使用的Content API,因此本質上它是跨應用的,因此在使用它時必需要考慮到不要被別的應用濫用;
二、LocalBroadcastManager不須要考慮安全問題,由於它只在應用內部有效。

19.AlertDialog,popupWindow區別

(1)Popupwindow在顯示以前必定要設置寬高,Dialog無此限制。
(2)Popupwindow默認不會響應物理鍵盤的back,除非顯示設置了popup.setFocusable(true);而在點擊back的時候,Dialog會消失。
(3)Popupwindow不會給頁面其餘的部分添加蒙層,而Dialog會。
(4)Popupwindow沒有標題,Dialog默認有標題,能夠經過dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消標題
(5)兩者顯示的時候都要設置Gravity。若是不設置,Dialog默認是Gravity.CENTER。
(6)兩者都有默認的背景,均可以經過setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
最本質的區別:AlertDialog是非阻塞式對話框:AlertDialog彈出時,後臺還能夠作事情;而PopupWindow是阻塞式對話框:PopupWindow彈出時,程序會等待,在PopupWindow退出前,程序一直等待,只有當咱們調用了dismiss方法的後,PopupWindow退出,程序纔會向下執行。

20.講解一下Context

Context是一個抽象基類。在翻譯爲上下文,也能夠理解爲環境,是提供一些程序的運行環境基礎信息。Context下有兩個子類,ContextWrapper是上下文功能的封裝類,而ContextImpl則是上下文功能的實現類。而ContextWrapper又有三個直接的子類, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一個帶主題的封裝類,而它有一個直接子類就是Activity,因此Activity和Service以及Application的Context是不同的,只有Activity須要主題,Service不須要主題。Context一共有三種類型,分別是Application、Activity和Service。這三個類雖然分別各類承擔着不一樣的做用,但它們都屬於Context的一種,而它們具體Context的功能則是由ContextImpl類去實現的,所以在絕大多數場景下,Activity、Service和Application這三種類型的Context都是能夠通用的。不過有幾種場景比較特殊,好比啓動Activity,還有彈出Dialog。出於安全緣由的考慮,Android是不容許Activity或Dialog憑空出現的,一個Activity的啓動必需要創建在另外一個Activity的基礎之上,也就是以此造成的返回棧。而Dialog則必須在一個Activity上面彈出(除非是System Alert類型的Dialog),所以在這種場景下,咱們只能使用Activity類型的Context,不然將會出錯。
getApplicationContext()和getApplication()方法獲得的對象都是同一個application對象,只是對象的類型不同。
Context數量 = Activity數量 + Service數量 + 1 (1爲Application)

21.Android屬性動畫特性

(1) 對任意對象的屬性執行動畫操做:屬性動畫容許對任意對象的屬性執行動畫操做,由於屬性動畫的性質是經過反射實現的。
(2)可改變背景顏色。
(3)真正改變 View 自己:由於是經過反射改變其屬性,並刷新,如改變width,他會搜索getWidth(),反射獲取,再經過進行某種計算,將值經過setWidth()設置進去並更新。

22.LinearLayout、RelativeLayout、FrameLayout的特性及對比,並介紹使用場景。

RelativeLayout的onMeasure過程
根據源碼咱們發現RelativeLayout會根據2次排列的結果對子View各作一次measure。
首先RelativeLayout中子View的排列方式是基於彼此的依賴關係,在肯定每一個子View的位置的時候,須要先給全部的子View排序一下,因此須要橫向縱向分別進行一次排序測量

23.LinearLayout的onMeasure過程

LinearLayout會先作一個簡單橫縱方向判斷
須要注意的是在每次對child測量完畢後,都會調用child.getMeasuredHeight()/getMeasuredWidth()獲取該子視圖最終的高度,並將這個高度添加到mTotalLength中。
可是getMeasuredHeight暫時避開了lp.weight>0且高度爲0子View,由於後面會將把剩餘高度按weight分配給相應的子View。所以能夠得出如下結論:
(1)若是咱們在LinearLayout中不使用weight屬性,將只進行一次measure的過程。(若是使用weight屬性,則遍歷一次wiew測量後,再遍歷一次view測量)
(2)若是使用了weight屬性,LinearLayout在第一次測量時獲取全部子View的高度,以後再將剩餘高度根據weight加到weight>0的子View上。因而可知,weight屬性對性能是有影響的。
1)RelativeLayout慢於LinearLayout是由於它會讓子View調用2次measure過程,而LinearLayout只需一次,可是有weight屬性存在時,LinearLayout也須要兩次measure。
2)在不響應層級深度的狀況下,使用Linearlayout而不是RelativeLayout。

24.談談對接口與回調的理解

接口回調就是指: 能夠把使用某一接口的類建立的對象的引用賦給該接口聲明的接口變量,那麼該接口變量就能夠調用被類實現的接口的方法。實際上,當接口變量調用被類實現的接口中的方法時,就是通知相應的對象調用接口的方法,這一過程稱爲對象功能的接口回調。

25.Android中View,SurfaceView和GLSurfaceView

View:顯示視圖,內置畫布,提供圖形繪製函數,觸屏事件,按鍵事件函數;必須在UI線程中更新畫面,速度較慢。
SurfaceView:基於View視圖進行拓展的視圖類,更適合2D遊戲的開發;是View的子類,相似雙緩機制,在新的線程中更新畫面,因此刷新界面速度比View快。(雙緩機制:即前臺緩存和後臺緩存,後臺緩存計算場景、產生畫面,前臺緩存顯示後臺緩存已畫好的畫面。)
GLSurfaceView:基於SurfaceView視圖再次進行擴展的視圖類,專用於3D遊戲開發的視圖;是SurfaceView的子類,OpenGL專用。(OpenGL:是一個開放的三維圖形軟件包。)

26.序列化的做用,以及Android兩種序列化的區別

做用:java序列化主要有2個做用:
對象持久化,對象生存在內存中,想把一個對象持久化到磁盤,必須已某種方式來組織這個對象包含的信息,這種方式就是序列化;
遠程網絡通訊,內存中的對象不能直接進行網絡傳輸,發送端把對象序列化成網絡可傳輸的字節流,接收端再把字節流還原成對象。

Serializable Java 序列化接口 在硬盤上讀寫 讀寫過程當中有大量臨時變量的生成,內部執行大量的i/o操做,效率很低。
Parcelable Android 序列化接口 效率高 使用麻煩 在內存中讀寫(AS有相關插件 一鍵生成所需方法) ,對象不能保存到磁盤中

27.差值器和估值器

差值器: 根據時間流逝的百分比計算當前屬性改變的百分比。
估值器: 根據當前屬性改變的百分比計算改變後的屬性值

28.Android中數據存儲方式

1 使用SharedPreferences存儲數據
適用範圍:保存少許的數據,且這些數據的格式很是簡單:字符串型、基本類型的值。
好比應用程序的各類配置信息(如是否打開音效等),解鎖口 令密碼等
核心原理:保存基於XML文件存儲的key-value鍵值對數據,一般用來存儲一些簡單的配置信息。

2 文件存儲數據
核心原理: Context提供了兩個方法來打開數據文件裏的文件IO流:
FileInputStream openFileInput(String name);
FileOutputStream openFileOutput(String name , int mode)
3 SQLite數據庫存儲數據
4 使用ContentProvider存儲數據
5 網絡存儲數據
Requestlayout,onlayout,onDraw,DrawChild區別與聯繫
requestLayout()方法 :會致使調用measure()過程 和 layout()過程 。 說明:只是對View樹從新佈局layout過程包括measure()和layout()過程,不會調用draw()過程,但不會從新繪製 任何視圖包括該調用者自己。
onLayout()方法(若是該View是ViewGroup對象,須要實現該方法,對每一個子視圖進行佈局)
調用onDraw()方法繪製視圖自己 (每一個View都須要重載該方法,ViewGroup不須要實現該方法)
drawChild()去從新回調每一個子視圖的draw()方法

29.invalidate和postInvalidate的區別及使用

一、postInvalidate() 方法在非 UI 線程中調用,通知 UI 線程重繪。
二、invalidate()方法在 UI 線程中調用,重繪當前 UI。Invalidate不能直接在線程中調用,由於他是違背了單線程模型:Android UI操做並非線程安全的,而且這些操做必須在UI線程中調用。

Activity-Window-View三者的差異
這個問題真的很很差回答。因此這裏先來個算是比較恰當的比喻來形容下它們的關係吧。Activity像一個工匠(控制單元),Window像窗戶(承載模型),View像窗花(顯示視圖)LayoutInflater像剪刀,Xml配置像窗花圖紙。
1:Activity構造的時候會初始化一個Window,準確的說是PhoneWindow。
2:這個PhoneWindow有一個「ViewRoot」,這個「ViewRoot」是一個View或者說ViewGroup,是最初始的根視圖。
3:「ViewRoot」經過addView方法來一個個的添加View。好比TextView,Button等
4:這些View的事件監聽,是由WindowManagerService來接受消息,而且回調Activity函數。好比onClickListener,onKeyDown等。

30.ActivityThread,AMS,WMS的工做原理

Activity與Window:
Activity只負責生命週期和事件處理
Window只控制視圖
一個Activity包含一個Window,若是Activity沒有Window,那就至關於Service。

因爲篇幅有限,只能分享部分面試題,更多面試題及答案能夠個人【Github】閱讀下載哦~無償分享給你們,算是一個感恩回饋吧

相關文章
相關標籤/搜索