25K大致算的上是Android開發(fā)的一個分水嶺了。沒點真正的東西,還真的拿不到25
目前成都創(chuàng)新互聯(lián)公司已為上千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、東川網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
本文講解:
我們?yōu)槭裁匆x擇離職
面試必問面試題
如何選擇心儀的公司
工資跟不上消費
上班找不到歸宿感和成績感,上班感覺和坐牢一樣
在公司沒有發(fā)展空間
1.APK安裝過程
應(yīng)用安裝涉及到如下幾個目錄:
system/app:系統(tǒng)自帶的應(yīng)用程序,無法刪除
data/app:用戶程序安裝的目錄,有刪除權(quán)限。安裝時把a(bǔ)pk文件復(fù)制到此目錄
data/data:存放應(yīng)用程序的數(shù)據(jù)
data/dalvik-cache:將apk中的dex文件安裝到dalvik-cache目錄下
復(fù)制APK安裝包到data/app目錄下,解壓并掃描安裝包,把dex文件(Dalvik字節(jié)碼)保存到dalvik-cache目錄,并在data/data目錄下創(chuàng)建對應(yīng)的應(yīng)用數(shù)據(jù)目錄
2.invalidate()和postInvalidate() 的區(qū)別
invalidate()是用來刷新View的,必須是在UI線程中進(jìn)行工作。比如在修改某個view的顯示時,調(diào)用invalidate()才能看到重新繪制的界面。
postInvalidate()在工作者線程中被調(diào)用。
3.Parcelable和Serializable區(qū)別
Parcelable的性能比Serializable好,在內(nèi)存開銷方面較小,所以在內(nèi)存間數(shù)據(jù)傳輸時推薦使用Parcelable,如activity間傳輸數(shù)據(jù),而Serializable可將數(shù)據(jù)持久化方便保存,所以在需要保存或網(wǎng)絡(luò)傳輸數(shù)據(jù)時選擇Serializable,因為android不同版本Parcelable可能不同,所以不推薦使用Parcelable進(jìn)行數(shù)據(jù)持久化。
Serializable序列化不保存靜態(tài)變量,可以使用Transient關(guān)鍵字對部分字段不進(jìn)行序列化,也可以覆蓋writeObject、readObject方法以實現(xiàn)序列化過程自定義。
4.Android里跨進(jìn)程傳遞數(shù)據(jù)的幾種方案
Binder
Socket/LocalSocket
共享內(nèi)存
5.匿名共享內(nèi)存,使用場景
在Android系統(tǒng)中,提供了獨特的匿名共享內(nèi)存子系統(tǒng)Ashmem(Anonymous Shared Memory),它以驅(qū)動程序的形式實現(xiàn)在內(nèi)核空間中。它有兩個特點,一是能夠輔助內(nèi)存管理系統(tǒng)來有效地管理不再使用的內(nèi)存塊,二是它通過Binder進(jìn)程間通信機(jī)制來實現(xiàn)進(jìn)程間的內(nèi)存共享。
ashmem并像Binder是Android重新自己搞的一套東西,而是利用了Linux的 tmpfs文件系統(tǒng)。tmpfs是一種可以基于RAM或是SWAP的高速文件系統(tǒng),然后可以拿它來實現(xiàn)不同進(jìn)程間的內(nèi)存共享。
大致思路和流程是:
Proc A 通過 tmpfs 創(chuàng)建一塊共享區(qū)域,得到這塊區(qū)域的 fd(文件描述符)
Proc A 在 fd 上 mmap 一片內(nèi)存區(qū)域到本進(jìn)程用于共享數(shù)據(jù)
Proc A 通過某種方法把 fd 倒騰給 Proc B
Proc B 在接到的 fd 上同樣 mmap 相同的區(qū)域到本進(jìn)程
然后 A、B 在 mmap 到本進(jìn)程中的內(nèi)存中讀、寫,對方都能看到了
其實核心點就是創(chuàng)建一塊共享區(qū)域,然后2個進(jìn)程同時把這片區(qū)域 mmap 到本進(jìn)程,然后讀寫就像本進(jìn)程的內(nèi)存一樣。這里要解釋下第3步,為什么要倒騰 fd,因為在 linux 中 fd 只是對本進(jìn)程是唯一的,在 Proc A 中打開一個文件得到一個 fd,但是把這個打開的 fd 直接放到 Proc B 中,Proc B 是無法直接使用的。但是文件是唯一的,就是說一個文件(file)可以被打開多次,每打開一次就有一個 fd(文件描述符),所以對于同一個文件來說,需要某種轉(zhuǎn)化,把 Proc A 中的 fd 轉(zhuǎn)化成 Proc B 中的 fd。這樣 Proc B 才能通過 fd mmap 同樣的共享內(nèi)存文件。
使用場景:進(jìn)程間大量數(shù)據(jù)傳輸
6.ContentProvider實現(xiàn)原理
ContentProvider 有以下兩個特點:
封裝:對數(shù)據(jù)進(jìn)行封裝,提供統(tǒng)一的接口,使用者完全不必關(guān)心這些數(shù)據(jù)是在DB,XML、Preferences或者網(wǎng)絡(luò)請求來的。當(dāng)項目需求要改變數(shù)據(jù)來源時,使用我們的地方完全不需要修改。
提供一種跨進(jìn)程數(shù)據(jù)共享的方式。
Content Provider組件在不同應(yīng)用程序之間傳輸數(shù)據(jù)是基于匿名共享內(nèi)存機(jī)制來實現(xiàn)的。其主要的調(diào)用過程:
①通過ContentResolver先查找對應(yīng)給定Uri的ContentProvider,返回對應(yīng)的BinderProxy
如果該Provider尚未被調(diào)用進(jìn)程使用過:
通過ServiceManager查找activity service得到ActivityManagerService對應(yīng)BinderProxy
調(diào)用BinderProxy的transcat方法發(fā)送GET_CONTENT_PROVIDER_TRANSACTION命令,得到對應(yīng)ContentProvider的BinderProxy。
如果該Provider已被調(diào)用進(jìn)程使用過,則調(diào)用進(jìn)程會保留使用過provider的HashMap。此時直接從此表查詢即得。
②調(diào)用BinderProxy的query()
7.如何使用ContentProvider進(jìn)行批量操作?
通常進(jìn)行數(shù)據(jù)的批量操作我們都會使用“事務(wù)”,但是ContentProvider如何進(jìn)行批量操作呢?創(chuàng)建 ContentProviderOperation 對象數(shù)組,然后使用 ContentResolver.applyBatch() 將其分派給內(nèi)容提供程序。您需將內(nèi)容提供程序的授權(quán)傳遞給此方法,而不是特定內(nèi)容 URI。這樣可使數(shù)組中的每個 ContentProviderOperation 對象都能適用于其他表。調(diào)用 ContentResolver.applyBatch() 會返回結(jié)果數(shù)組。
同時我們還可以通過ContentObserver對數(shù)據(jù)進(jìn)行觀察:
創(chuàng)建我們特定的ContentObserver派生類,必須重載onChange()方法去處理回調(diào)后的功能實現(xiàn)
利用context.getContentResolover()獲得ContentResolove對象,接著調(diào)用registerContentObserver()方法去注冊內(nèi)容觀察者,為指定的Uri注冊一個ContentObserver派生類實例,當(dāng)給定的Uri發(fā)生改變時,回調(diào)該實例對象去處理。
由于ContentObserver的生命周期不同步于Activity和Service等,因此,在不需要時,需要手動的調(diào)用unregisterContentObserver()去取消注冊。
8.廣播注冊后不解除注冊會有什么問題?(內(nèi)存泄露)
我們可以通過兩種方式注冊BroadcastReceiver,一是在Activity啟動過程中通過代碼動態(tài)注冊,二是在AndroidManifest.xml文件中利用
對于第一種方法,我們需要養(yǎng)成一個良好的習(xí)慣:在Activity進(jìn)入停止或者銷毀狀態(tài)的時候使用unregisterReceiver方法將注冊的BroadcastReceiver注銷掉。
對于
9.屬性動畫(Property Animation)和補(bǔ)間動畫(Tween Animation)的區(qū)別
10.BrocastReceive里面可不可以執(zhí)行耗時操作?
11.Android優(yōu)化工具:TraceView和Systrace
12.Dalvik與ART的區(qū)別?
13.Android動態(tài)權(quán)限?
14.ViewPager如何判斷左右滑動?
實現(xiàn)OnPageChangeListener并重寫onPageScrolled方法,通過參數(shù)進(jìn)行判斷。
15.ListView與RecyclerView
16.描述一下Android手機(jī)啟動過程和App啟動過程?
Android手機(jī)啟動過程
當(dāng)我們開機(jī)時,首先是啟動Linux內(nèi)核,在Linux內(nèi)核中首先啟動的是init進(jìn)程,這個進(jìn)程會去讀取配置文件system\core\rootdir\init.rc
配置文件,這個文件中配置了Android系統(tǒng)中第一個進(jìn)程Zygote進(jìn)程。
啟動Zygote進(jìn)程 --> 創(chuàng)建AppRuntime(Android運行環(huán)境) --> 啟動虛擬機(jī) --> 在虛擬機(jī)中注冊JNI方法 --> 初始化進(jìn)程通信使用的Socket(用于接收AMS的請求) --> 啟動系統(tǒng)服務(wù)進(jìn)程 --> 初始化時區(qū)、鍵盤布局等通用信息 --> 啟動Binder線程池 --> 初始化系統(tǒng)服務(wù)(包括PMS,AMS等等) --> 啟動Launcher
App啟動過程
應(yīng)用的啟動是從其他應(yīng)用調(diào)用startActivity開始的。通過代理請求AMS啟動Activity。
AMS創(chuàng)建進(jìn)程,并進(jìn)入ActivityThread的main入口。在main入口,主線程初始化,并loop起來。主線程初始化,主要是實例化ActivityThread和ApplicationThread,以及MainLooper的創(chuàng)建。ActivityThread和ApplicationThread實例用于與AMS進(jìn)程通信。
應(yīng)用進(jìn)程將實例化的ApplicationThread,Binder傳遞給AMS,這樣AMS就可以通過代理對應(yīng)用進(jìn)程進(jìn)行訪問。
AMS通過代理,請求啟動Activity。ApplicationThread通知主線程執(zhí)行該請求。然后,ActivityThread執(zhí)行Activity的啟動。
Activity的啟動包括,Activity的實例化,Application的實例化,以及Activity的啟動流程:create、start、resume。
可以看到 入口Activity其實是先于Application實例化,只是onCreate之類的流程,先于Activity的流程。另外需要scheduleLaunchActivity,在ApplicationThreaad中,對應(yīng)AMS管理Activity生命周期的方法都以scheduleXXXActivity,ApplicationThread在Binder線程中,它會向主線程發(fā)送消息,ActivityThread的Handler會調(diào)用相應(yīng)的handleXXXActivity方法,然后會執(zhí)行performXXXActivity方法,最終調(diào)用Activity的onXXX方法
17.Asset目錄與res目錄的區(qū)別
18.Application 在多進(jìn)程下會多次調(diào)用 onCreate() 么?
當(dāng)采用多進(jìn)程的時候,比如下面的Service 配置:
android:process 屬性中 :的作用就是把這個名字附加到你的包所運行的標(biāo)準(zhǔn)進(jìn)程名字的后面作為新的進(jìn)程名稱。
這樣配置會調(diào)用 onCreate() 兩次
19.FragmentPagerAdapter 和 FragmentStateAdapter 的區(qū)別?
20.SurfaceView && View && GLSurfaceView
更多題目答案,請文末領(lǐng)取
多家offer,如何選擇?
廠大選大的 ,廠小選公司有錢的,都差不多選加班少的,加班都多,選錢多的。
只要技術(shù)在手,哪里都有飯吃,最后千萬別裸辭
有沒有志同道合的小伙伴共同進(jìn)步?前面說的那些面試題的答案呢?
對此整理了一套適合Android工程師學(xué)習(xí)的資料文檔分享《Android架構(gòu)視頻+BAT面試專題PDF+學(xué)習(xí)筆記》
如果感覺本文對你有幫助,請點個贊吧謝謝~