Android面試題總結(六)Android源碼篇

1.Android各版本API區別?

https://blog.csdn.net/andypan1314/article/details/6583563(轉)

2.Requestlayout,onlayout,onDraw,DrawChild區別與聯繫

requestLayout()方法 :會導致調用measure()過程 和 layout()過程 。 說明:只是對View樹重新佈局layout過程包括measure()和layout()過程,不會調用draw()過程,但不會重新繪製 任何視圖包括該調用者本身。

onLayout()方法(如果該View是ViewGroup對象,需要實現該方法,對每個子視圖進行佈局)

調用onDraw()方法繪製視圖本身 (每個View都需要重載該方法,ViewGroup不需要實現該方法)

drawChild()去重新回調每個子視圖的draw()方法

https://blog.csdn.net/weixin_41101173/article/details/79726311(轉)

3.invalidate和postInvalidate的區別及使用

https://www.jianshu.com/p/e147f381190c(轉)

4.Activity-Window-View三者的差別?

https://juejin.im/entry/596329686fb9a06bc903b6fd

5.談談對Volley的理解?

https://www.jianshu.com/p/a35afb377d7f

6.如何優化自定義view?

http://hukai.me/android-training-course-in-chinese/ui/custom-view/optimize-view.html(官方文檔)

7.低版本SDK如何實現高版本API?

https://www.cnblogs.com/yaowen/p/5732614.html

8.描述一次網絡請求的流程?

https://blog.csdn.net/SEU_Calvin/article/details/53304406

https://www.jianshu.com/p/f184b8cee0a4

9.網絡請求框架的對比?

https://www.jianshu.com/p/2fa728c8b366

https://blog.csdn.net/zxm317122667/article/details/53234556

10.Looper架構?

https://blog.csdn.net/hengqiaqia/article/details/78335239

11.Android源碼:AMS、PMS、WMS原理分析

https://blog.csdn.net/shareus/article/details/51174623

12.自定義view如何考慮機型適配

  • 合理使用warp_content,match_parent.
  • 儘可能的是使用RelativeLayout
  • 針對不同的機型,使用不同的佈局文件放在對應的目錄下,android會自動匹配。
  • 儘量使用點9圖片。
  • 使用與密度無關的像素單位dp,sp
  • 引入android的百分比佈局。
  • 切圖的時候切大分辨率的圖,應用到佈局當中。在小分辨率的手機上也會有很好的顯示效果

13.Android中AsyncTask詳解?

https://blog.csdn.net/iispring/article/details/50639090

14.SpareArray原理?

在Android開發中如果使用key爲Integer的HashMap,就會出現黃色警告,提示使用SparseArray,SparseArray具有比HashMap更高的內存使用效率,HashMap的存儲方式是數組加鏈表,SparseArray是使用純數組的形式存儲,SparseArray採用時間換取空間的方式來提高手機App的運行效率,這也是其與HashMap的區別;HashMap通過空間換取時間,查找迅速;HashMap中當table數組中內容達到總容量0.75時,則擴展爲當前容量的兩倍

  • SparseArray的key爲int,value爲Object。
  • 在Android中,數據長度小於千時,用於替換HashMap
  • 相比與HashMap,其採用 時間換空間 的方式,使用更少的內存來提高手機APP的運行效率(HashMap中當table數組中內容達到總容量0.75時,則擴展爲當前容量的兩倍

https://blog.csdn.net/xiaxl/article/details/77267201

15.ContentProvider是如何實現數據共享的?

當一個應用程序需要把自己的數據暴露給其他程序使用時,該就用程序就可通過提供ContentProvider來實現;其他應用程序就可通過ContentResolver來操作ContentProvider暴露的數據。
一旦某個應用程序通過ContentProvider暴露了自己的數據操作接口,那麼不管該應用程序是否啓動,其他應用程序都可以通過該接口來操作該應用程序的內部數據,包括增加數據、刪除數據、修改數據、查詢數據等。
ContentProvider以某種Uri的形式對外提供數據,允許其他應用訪問或修改數據;其他應用程序使用ContentResolver根據Uri去訪問操作指定數據。
步驟:
1、定義自己的ContentProvider類,該類需要繼承Android提供的ContentProvider基類。
2、在AndroidManifest.xml文件中註冊個ContentProvider,註冊ContenProvider時需要爲它綁定一個URL。
例:

說明:authorities就相當於爲該ContentProvider指定URL。
註冊後,其他應用程序就可以通過該Uri來訪問MyProvider所暴露的數據了。
接下來,使用ContentResolver操作數據,Context提供瞭如下方法來獲取ContentResolver對象。
一般來說,ContentProvider是單例模式,當多個應用程序通過ContentResolver來操作 ContentProvider提供的數據時,ContentResolver調用的數據操作將會委託給同一個ContentProvider處理。
使用ContentResolver操作數據只需兩步:
1、調用Activity的ContentResolver獲取ContentResolver對象。
2、根據需要調用ContentResolver的insert()、delete()、update()和query()方法操作數據即可

16.Activity與Service通信有哪幾種方式?

(1)通過Binder對象

(2)通過Broadcast廣播形式

(3)通過接口

(4)通過Intent

17.IntentService原理及其使用?

用IntentService有什麼好處呢?首先,我們省去了在Service中手動開線程的麻煩,第二,當操作完成時,我們不用手動停止Service,第三,使用操作方便

https://blog.csdn.net/ryantang03/article/details/8146154

18.說說Activity,Intent,Service之間的關係?

一個 Activity 通常是一個單獨的屏幕,

每一個 Activity 都被實現爲一個單獨的類,

這些類都 是從 Activity 基類中繼承來的,

Activity 類會顯示由視圖控件組成的用戶接口,

並對視圖控 件的事件做出響應。 

Intent 的調用是用來進行架構屏幕之間的切換的。

Intent 是描述應用想要做什麼。

Intent 數 據結構中兩個最重要的部分是動作和動作 對應的數據,

一個動作對應一個動作數據。

Android Service 是運行在後臺的代碼,

不能與用戶交互,可以運行在自己的進程,也可以 運行在其他應用程序進程的上下文裏。

需要通過某一個 Activity 或者其他 Context 對象來調 用。 

Activity 跳轉到 Activity,Activity 啓動 Service,Service 打開 Activity 

都需要 Intent 表明跳轉 的意圖,以及傳遞參數,Intent 是這些組件間信號傳遞的承載者。 

19.Application Context和Activity Context的區別

1.
Application的Context是一個全局靜態變量,SDK的說明是隻有當你引用這個context的生命週期超過了當前activity的生命週期,而和整個應用的生命週期掛鉤時,纔去使用這個application的context。

一種推薦的用法就是應用程序註冊廣播broadcast時,使用這個context。

引用application context並不會導致內存泄漏。引用activity的context纔會導致內存泄漏,當你的引用對象的生命週期超過了當前activity的生命
週期時,系統回收你的activity時發現還有一個context的強引用,而不去銷燬這個activity,導致內存泄漏,在開發過程中,需要非常重
視這點(一個全局靜態變量在引用context時一定要使用application的Context, 而不要使用activity的)

2.
在android中context可以作很多操作,但是最主要的功能是加載和訪問資源。在android中有兩種context,
一種是 application context,
一種是activity context,通常我們在各種類和方法間傳遞的是activity context。
 比如一個activity的onCreate: 
protected void onCreate(Bundle state) {
   super.onCreate(state); 
   TextView label = newTextView(this); //傳遞context給view control label.setText("Leaks are bad");
   setContentView(label);
把activity context傳遞給view,意味着view擁有一個指向activity的引用,進而引用activity佔有的資源:view hierachy,resource等。
 這樣如果context發生內存泄露的話,就會泄露很多內存。 這裏泄露的意思是gc沒有辦法回收activity的內存。 
Leaking an entire activity是很容易的一件事。 當屏幕旋轉的時候,系統會銷燬當前的activity,保存狀態信息,再創建一個新的。 
比如我們寫了一個應用程序,它需要加載一個很大的圖片,我們不希望每次旋轉屏 
幕的時候都銷燬這個圖片,重新加載。實現這個要求的簡單想法就是定義一個靜態的Drawable,這樣Activity 類創建銷燬它始終保存在內存中。
 實現類似: public class myactivity extends Activity { private static Drawable sBackground; protected voidonCreate(Bundle state) { super.onCreate(state); TextView label = new TextView(this); label.setText("Leaks are bad"); if (sBackground == null) { sBackground = getDrawable(R.drawable.large_bitmap); } label.setBackgroundDrawable(sBackground);//drawable attached to a view setContentView(label);
 } } 
這段程序看起來很簡單,但是卻問題很大。當屏幕旋轉的時候會有leak(即gc沒法銷燬activity)。 
我們剛纔說過,屏幕旋轉的時候系統會銷燬當前的activity。但是當drawable和view關聯後,drawable保存了view的 reference,即sBackground保存了label的引用,而label保存了activity的引用。既然drawable不能銷燬,它所引用和間接引用的都不能銷燬,這樣系統就沒有辦法銷燬當前的activity,於是造成了內存泄露。gc對這種類型的內存泄露是無能爲力的。 
避免這種內存泄露的方法是避免activity中的任何對象的生命週期長過activity,避免由於對象對 activity的引用導致activity不能正常被銷燬,我們可以使用application context。
application context伴隨application的一生,與activity的生命週期無關。
application context可以通過Context.getApplicationContext或者Activity.getApplication方法獲取。 
避免context相關的內存泄露,記住以下幾點: 
(1). 不要讓生命週期長的對象引用activity context,即保證引用activity的對象要與activity本身生命週期是一樣的 
(2). 對於生命週期長的對象,可以使用application context 
(3). 避免非靜態的內部類,儘量使用靜態類,避免生命週期問題,注意內部類對外部對象引用導致的生命週期變化

20.SP是進程同步嗎?有什麼辦法可以讓他同步?

1. SharedPreferences不支持進程同步

一個進程的情況,經常採用SharePreference來做,但是SharePreference不支持多進程,它基於單個文件的,默認是沒有考慮同步互斥,而且,APP對SP對象做了緩存,不好互斥同步.

MODE_MULTI_PROCESS的作用是什麼?

在getSharedPreferences的時候, 會強制讓SP進行一次讀取操作,從而保證數據是最新的. 但是若頻繁多進程進行讀寫 . 若某個進程持有了一個外部sp對象, 那麼不能保證數據是最新的. 因爲剛剛被別的進程更新了.

2.考慮用ContentProvider來實現SharedPreferences的進程同步.

ContentProvider基於Binder,不存在進程間互斥問題,對於同步,也做了很好的封裝,不需要開發者額外實現。 

另外ContentProvider的每次操作都會重新getSP. 保證了sp的一致性.

21.Android中多線程的使用?

https://blog.csdn.net/a992036795/article/details/51362487

22.進程和應用的生命週期?

https://blog.csdn.net/timshinlee/article/details/73770821

23.RecycleView原理

https://blog.csdn.net/xyh269/article/details/53047855

24.AndroidMainfest的作用與理解

https://www.cnblogs.com/-OYK/archive/2011/05/31/2064818.html

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