25K大體算的上是Android開發的一個分水嶺了。沒點真正的東西,還真的拿不到25html
本文講解:linux
咱們爲何要選擇離職android
面試必問面試題面試
如何選擇心儀的公司數組
工資跟不上消費網絡
上班找不到歸宿感和成績感,上班感受和坐牢同樣架構
在公司沒有發展空間app
1.APK安裝過程
應用安裝涉及到以下幾個目錄:ide
system/app:系統自帶的應用程序,沒法刪除工具
data/app:用戶程序安裝的目錄,有刪除權限。安裝時把apk文件複製到此目錄
data/data:存放應用程序的數據
data/dalvik-cache:將apk中的dex文件安裝到dalvik-cache目錄下
複製APK安裝包到data/app目錄下,解壓並掃描安裝包,把dex文件(Dalvik字節碼)保存到dalvik-cache目錄,並在data/data目錄下建立對應的應用數據目錄
2.invalidate()和postInvalidate() 的區別
invalidate()是用來刷新View的,必須是在UI線程中進行工做。好比在修改某個view的顯示時,調用invalidate()才能看到從新繪製的界面。
postInvalidate()在工做者線程中被調用。
3.Parcelable和Serializable區別
Parcelable的性能比Serializable好,在內存開銷方面較小,因此在內存間數據傳輸時推薦使用Parcelable,如activity間傳輸數據,而Serializable可將數據持久化方便保存,因此在須要保存或網絡傳輸數據時選擇Serializable,由於android不一樣版本Parcelable可能不一樣,因此不推薦使用Parcelable進行數據持久化。
Serializable序列化不保存靜態變量,可使用Transient關鍵字對部分字段不進行序列化,也能夠覆蓋writeObject、readObject方法以實現序列化過程自定義。
4.Android裏跨進程傳遞數據的幾種方案
Binder
Socket/LocalSocket
共享內存
5.匿名共享內存,使用場景
在Android系統中,提供了獨特的匿名共享內存子系統Ashmem(Anonymous Shared Memory),它以驅動程序的形式實如今內核空間中。它有兩個特色,一是可以輔助內存管理系統來有效地管理再也不使用的內存塊,二是它經過Binder進程間通訊機制來實現進程間的內存共享。
ashmem並像Binder是Android從新本身搞的一套東西,而是利用了Linux的 tmpfs文件系統。tmpfs是一種能夠基於RAM或是SWAP的高速文件系統,而後能夠拿它來實現不一樣進程間的內存共享。
大體思路和流程是:
Proc A 經過 tmpfs 建立一塊共享區域,獲得這塊區域的 fd(文件描述符)
Proc A 在 fd 上 mmap 一片內存區域到本進程用於共享數據
Proc A 經過某種方法把 fd 倒騰給 Proc B
Proc B 在接到的 fd 上一樣 mmap 相同的區域到本進程
而後 A、B 在 mmap 到本進程中的內存中讀、寫,對方都能看到了
其實核心點就是建立一塊共享區域,而後2個進程同時把這片區域 mmap 到本進程,而後讀寫就像本進程的內存同樣。這裏要解釋下第3步,爲何要倒騰 fd,由於在 linux 中 fd 只是對本進程是惟一的,在 Proc A 中打開一個文件獲得一個 fd,可是把這個打開的 fd 直接放到 Proc B 中,Proc B 是沒法直接使用的。可是文件是惟一的,就是說一個文件(file)能夠被打開屢次,每打開一次就有一個 fd(文件描述符),因此對於同一個文件來講,須要某種轉化,把 Proc A 中的 fd 轉化成 Proc B 中的 fd。這樣 Proc B 才能經過 fd mmap 一樣的共享內存文件。
使用場景:進程間大量數據傳輸
6.ContentProvider實現原理
ContentProvider 有如下兩個特色:
封裝:對數據進行封裝,提供統一的接口,使用者徹底沒必要關心這些數據是在DB,XML、Preferences或者網絡請求來的。當項目需求要改變數據來源時,使用咱們的地方徹底不須要修改。
提供一種跨進程數據共享的方式。
Content Provider組件在不一樣應用程序之間傳輸數據是基於匿名共享內存機制來實現的。其主要的調用過程:
①經過ContentResolver先查找對應給定Uri的ContentProvider,返回對應的BinderProxy
若是該Provider還沒有被調用進程使用過:
經過ServiceManager查找activity service獲得ActivityManagerService對應BinderProxy
調用BinderProxy的transcat方法發送GET_CONTENT_PROVIDER_TRANSACTION命令,獲得對應ContentProvider的BinderProxy。
若是該Provider已被調用進程使用過,則調用進程會保留使用過provider的HashMap。此時直接今後表查詢即得。
②調用BinderProxy的query()
7.如何使用ContentProvider進行批量操做?
一般進行數據的批量操做咱們都會使用「事務」,可是ContentProvider如何進行批量操做呢?建立 ContentProviderOperation 對象數組,而後使用 ContentResolver.applyBatch() 將其分派給內容提供程序。您需將內容提供程序的受權傳遞給此方法,而不是特定內容 URI。這樣可以使數組中的每一個 ContentProviderOperation 對象都能適用於其餘表。調用 ContentResolver.applyBatch() 會返回結果數組。
同時咱們還能夠經過ContentObserver對數據進行觀察:
建立咱們特定的ContentObserver派生類,必須重載onChange()方法去處理回調後的功能實現
利用context.getContentResolover()得到ContentResolove對象,接着調用registerContentObserver()方法去註冊內容觀察者,爲指定的Uri註冊一個ContentObserver派生類實例,當給定的Uri發生改變時,回調該實例對象去處理。
因爲ContentObserver的生命週期不一樣步於Activity和Service等,所以,在不須要時,須要手動的調用unregisterContentObserver()去取消註冊。
8.廣播註冊後不解除註冊會有什麼問題?(內存泄露)
咱們能夠經過兩種方式註冊BroadcastReceiver,一是在Activity啓動過程當中經過代碼動態註冊,二是在AndroidManifest.xml文件中利用<receiver>標籤進行靜態註冊。
對於第一種方法,咱們須要養成一個良好的習慣:在Activity進入中止或者銷燬狀態的時候使用unregisterReceiver方法將註冊的BroadcastReceiver註銷掉。
對於<receiver>標籤進行註冊的,那麼該對象的實例在onReceive被調用以後就會在任意時間內被銷燬。
9.屬性動畫(Property Animation)和補間動畫(Tween Animation)的區別
10.BrocastReceive裏面可不能夠執行耗時操做?
11.Android優化工具:TraceView和Systrace
12.Dalvik與ART的區別?
13.Android動態權限?
14.ViewPager如何判斷左右滑動?
實現OnPageChangeListener並重寫onPageScrolled方法,經過參數進行判斷。
15.ListView與RecyclerView
16.描述一下Android手機啓動過程和App啓動過程?
Android手機啓動過程
當咱們開機時,首先是啓動Linux內核,在Linux內核中首先啓動的是init進程,這個進程會去讀取配置文件system\core\rootdir\init.rc
配置文件,這個文件中配置了Android系統中第一個進程Zygote進程。
啓動Zygote進程 --> 建立AppRuntime(Android運行環境) --> 啓動虛擬機 --> 在虛擬機中註冊JNI方法 --> 初始化進程通訊使用的Socket(用於接收AMS的請求) --> 啓動系統服務進程 --> 初始化時區、鍵盤佈局等通用信息 --> 啓動Binder線程池 --> 初始化系統服務(包括PMS,AMS等等) --> 啓動Launcher
App啓動過程
應用的啓動是從其餘應用調用startActivity開始的。經過代理請求AMS啓動Activity。
AMS建立進程,並進入ActivityThread的main入口。在main入口,主線程初始化,並loop起來。主線程初始化,主要是實例化ActivityThread和ApplicationThread,以及MainLooper的建立。ActivityThread和ApplicationThread實例用於與AMS進程通訊。
應用進程將實例化的ApplicationThread,Binder傳遞給AMS,這樣AMS就能夠經過代理對應用進程進行訪問。
AMS經過代理,請求啓動Activity。ApplicationThread通知主線程執行該請求。而後,ActivityThread執行Activity的啓動。
Activity的啓動包括,Activity的實例化,Application的實例化,以及Activity的啓動流程:create、start、resume。
能夠看到 入口Activity實際上是先於Application實例化,只是onCreate之類的流程,先於Activity的流程。另外須要scheduleLaunchActivity,在ApplicationThreaad中,對應AMS管理Activity生命週期的方法都以scheduleXXXActivity,ApplicationThread在Binder線程中,它會向主線程發送消息,ActivityThread的Handler會調用相應的handleXXXActivity方法,而後會執行performXXXActivity方法,最終調用Activity的onXXX方法
17.Asset目錄與res目錄的區別
18.Application 在多進程下會屢次調用 onCreate() 麼?
當採用多進程的時候,好比下面的Service 配置:
<service android:name=".MyService" android:enabled="true" android:exported="false" android:process=":remote" />
android:process 屬性中 :的做用就是把這個名字附加到你的包所運行的標準進程名字的後面做爲新的進程名稱。
這樣配置會調用 onCreate() 兩次
19.FragmentPagerAdapter 和 FragmentStateAdapter 的區別?
20.SurfaceView && View && GLSurfaceView
更多題目答案,請文末領取
多家offer,如何選擇?
廠大選大的 ,廠小選公司有錢的,都差很少選加班少的,加班都多,選錢多的。
只要技術在手,哪裏都有飯吃,最後千萬別裸辭
有沒有志同道合的小夥伴共同進步?前面說的那些面試題的答案呢?
對此整理了一套適合Android工程師學習的資料文檔分享《Android架構視頻+BAT面試專題PDF+學習筆記》
若是感受本文對你有幫助,請點個贊吧謝謝~