[转载] 【汇总】Android知识清单
轉自 https://blog.csdn.net/asahinokawa/article/details/79415701
此部分(到分割線為止)來自出自AWeiLoveAndroid的博客https://www.jianshu.com/p/c70989bd5f29。初次看到是在鴻洋的微信公眾號上,第一次見到這么全的清單。對作者的辛苦勞動成果表示感謝!
java面試題匯總
熟練掌握java是很關鍵的,大公司不僅僅要求你會使用幾個api,更多的是要你熟悉源碼實現原理,甚至要你知道有哪些不足,怎么改進,還有一些java有關的一些算法,設計模式等等。
一、java基礎面試知識點
- java中==和equals和hashCode的區別
- int、char、long各占多少字節數
- int與integer的區別
- 探探對java多態的理解
- String、StringBuffer、StringBuilder區別
- 什么是內部類?內部類的作用
- 抽象類和接口區別
- 抽象類的意義
- 抽象類與接口的應用場景
- 抽象類是否可以沒有方法和屬性?
- 接口的意義
- 泛型中extends和super的區別
- 父類的靜態方法能否被子類重寫
- 進程和線程的區別
- final,finally,finalize的區別
- 序列化的方式
- Serializable 和Parcelable 的區別
- 靜態屬性和靜態方法是否可以被繼承?是否可以被重寫?以及原因?
- 靜態內部類的設計意圖
- 成員內部類、靜態內部類、局部內部類和匿名內部類的理解,以及項目中的應用
- 談談對kotlin的理解
- 閉包和局部內部類的區別
- string 轉換成 integer的方式及原理
二、java深入源碼級的面試題(有難度)
- 哪些情況下的對象會被垃圾回收機制處理掉?
- 講一下常見編碼方式?
- utf-8編碼中的中文占幾個字節;int型幾個字節?
- 靜態代理和動態代理的區別,什么場景使用?
- Java的異常體系
- 談談你對解析與分派的認識。
- 修改對象A的equals方法的簽名,那么使用HashMap存放這個對象實例的時候,會調用哪個equals方法?
- Java中實現多態的機制是什么?
- 如何將一個Java對象序列化到文件里?
- 說說你對Java反射的理解
- 說說你對Java注解的理解
- 說說你對依賴注入的理解
- 說一下泛型原理,并舉例說明
- Java中String的了解
- String為什么要設計成不可變的?
- Object類的equal和hashCode方法重寫,為什么?
三、數據結構
- 常用數據結構簡介
- 并發集合了解哪些?
- 列舉java的集合以及集合之間的繼承關系
- 集合類以及集合框架
- 容器類介紹以及之間的區別(容器類估計很多人沒聽這個詞,Java容器主要可以劃分為4個部分:List列表、Set集合、Map映射、工具類(Iterator迭代器、Enumeration枚舉類、Arrays和Collections),具體的可以看看這篇博文 Java容器類)
- List,Set,Map的區別
- List和Map的實現方式以及存儲方式
- HashMap的實現原理
- HashMap數據結構?
- HashMap源碼理解
- HashMap如何put數據(從HashMap源碼角度講解)?
- HashMap怎么手寫實現?
- ConcurrentHashMap的實現原理
- ArrayMap和HashMap的對比
- HashTable實現原理
- TreeMap具體實現
- HashMap和HashTable的區別
- HashMap與HashSet的區別
- HashSet與HashMap怎么判斷集合元素重復?
- 集合Set實現Hash怎么防止碰撞
- ArrayList和LinkedList的區別,以及應用場景
- 數組和鏈表的區別
- 二叉樹的深度優先遍歷和廣度優先遍歷的具體實現
- 堆的結構
- 堆和樹的區別
- 堆和棧在內存中的區別是什么(解答提示:可以從數據結構方面以及實際實現方面兩個方面去回答)?
- 什么是深拷貝和淺拷貝
- 手寫鏈表逆序代碼
- 講一下對樹,B+樹的理解
- 講一下對圖的理解
- 判斷單鏈表成環與否?
- 鏈表翻轉(即:翻轉一個單項鏈表)
- 合并多個單有序鏈表(假設都是遞增的)
四、線程、多線程和線程池
- 開啟線程的三種方式?
- 線程和進程的區別?
- 為什么要有線程,而不是僅僅用進程?
- run()和start()方法區別
- 如何控制某個方法允許并發訪問線程的個數?
- 在Java中wait和seelp方法的不同;
- 談談wait/notify關鍵字的理解
- 什么導致線程阻塞?
- 線程如何關閉?
- 講一下java中的同步的方法
- 數據一致性如何保證?
- 如何保證線程安全?
- 如何實現線程同步?
- 兩個進程同時要求寫或者讀,能不能實現?如何防止進程的同步?
- 線程間操作List
- Java中對象的生命周期
- Synchronized用法
- synchronize的原理
- 談談對Synchronized關鍵字,類鎖,方法鎖,重入鎖的理解
- static synchronized 方法的多線程訪問和作用
- 同一個類里面兩個synchronized方法,兩個線程同時訪問的問題
- volatile的原理
- 談談volatile關鍵字的用法
- 談談volatile關鍵字的作用
- 談談NIO的理解
- synchronized 和volatile 關鍵字的區別
- synchronized與Lock的區別
- ReentrantLock 、synchronized和volatile比較
- ReentrantLock的內部實現
- lock原理
- 死鎖的四個必要條件?
- 怎么避免死鎖?
- 對象鎖和類鎖是否會互相影響?
- 什么是線程池,如何使用?
- Java的并發、多線程、線程模型
- 談談對多線程的理解
- 多線程有什么要注意的問題?
- 談談你對并發編程的理解并舉例說明
- 談談你對多線程同步機制的理解?
- 如何保證多線程讀寫文件的安全?
- 多線程斷點續傳原理
- 斷點續傳的實現
并發編程有關知識點(這個是一般Android開發用的少的,所以建議多去看看):
平時Android開發中對并發編程可以做得比較少,Thread這個類經常會用到,但是我們想提升自己的話,一定不能停留在表面,,我們也應該去了解一下java的關于線程相關的源碼級別的東西。
學習的參考資料如下:
Java 內存模型
- java線程安全總結
- 深入理解java內存模型系列文章
線程狀態:
- 一張圖讓你看懂JAVA線程間的狀態轉換
鎖:
- 鎖機制:synchronized、Lock、Condition
- Java 中的鎖
并發編程:
- Java并發編程:Thread類的使用
- Java多線程編程總結
- Java并發編程的總結與思考
- Java并發編程實戰—–synchronized
- 深入分析ConcurrentHashMap
Android面試題
Android面試題除了Android基礎之外,更多的問的是一些源碼級別的、原理這些等。所以想去大公司面試,一定要多看看源碼和實現方式,常用框架可以試試自己能不能手寫實現一下,鍛煉一下自己。
一、Android基礎知識點
- 四大組件是什么
- 四大組件的生命周期和簡單用法
- Activity之間的通信方式
- Activity各種情況下的生命周期
- 橫豎屏切換的時候,Activity 各種情況下的生命周期
- Activity與Fragment之間生命周期比較
- Activity上有Dialog的時候按Home鍵時的生命周期
- 兩個Activity 之間跳轉時必然會執行的是哪幾個方法?
- 前臺切換到后臺,然后再回到前臺,Activity生命周期回調方法。彈出Dialog,生命值周期回調方法。
- Activity的四種啟動模式對比
- Activity狀態保存于恢復
- fragment各種情況下的生命周期
- Fragment狀態保存startActivityForResult是哪個類的方法,在什么情況下使用?
- 如何實現Fragment的滑動?
- fragment之間傳遞數據的方式?
- Activity 怎么和Service 綁定?
- 怎么在Activity 中啟動自己對應的Service?
- service和activity怎么進行數據交互?
- Service的開啟方式
- 請描述一下Service 的生命周期
- 談談你對ContentProvider的理解
- 說說ContentProvider、ContentResolver、ContentObserver 之間的關系
- 請描述一下廣播BroadcastReceiver的理解
- 廣播的分類
- 廣播使用的方式和場景
- 在manifest 和代碼中如何注冊和使用BroadcastReceiver?
- 本地廣播和全局廣播有什么差別?
- BroadcastReceiver,LocalBroadcastReceiver 區別
- AlertDialog,popupWindow,Activity區別
- Application 和 Activity 的 Context 對象的區別
- Android屬性動畫特性
- 如何導入外部數據庫?
- LinearLayout、RelativeLayout、FrameLayout的特性及對比,并介紹使用場景。
- 談談對接口與回調的理解
- 回調的原理
- 寫一個回調demo
- 介紹下SurfView
- RecycleView的使用
- 序列化的作用,以及Android兩種序列化的區別
- 差值器
- 估值器
- Android中數據存儲方式
二、Android源碼相關分析
- Android動畫框架實現原理
- Android各個版本API的區別
- Requestlayout,onlayout,onDraw,DrawChild區別與聯系
- invalidate和postInvalidate的區別及使用
- Activity-Window-View三者的差別
- 談談對Volley的理解
- 如何優化自定義View
- 低版本SDK如何實現高版本api?
- 描述一次網絡請求的流程
- HttpUrlConnection 和 okhttp關系
- Bitmap對象的理解
- looper架構
- ActivityThread,AMS,WMS的工作原理
- 自定義View如何考慮機型適配
- 自定義View的事件
- AstncTask+HttpClient 與 AsyncHttpClient有什么區別?
- LaunchMode應用場景
- AsyncTask 如何使用?
- SpareArray原理
- 請介紹下ContentProvider 是如何實現數據共享的?
- AndroidService與Activity之間通信的幾種方式
- IntentService原理及作用是什么?
- 說說Activity、Intent、Service 是什么關系
- ApplicationContext和ActivityContext的區別
- SP是進程同步的嗎?有什么方法做到同步?
- 談談多線程在Android中的使用
- 進程和 Application 的生命周期
- 封裝View的時候怎么知道view的大小
- RecycleView原理
- AndroidManifest的作用與理解
三、常見的一些原理性問題
- Handler機制和底層實現
- Handler、Thread和HandlerThread的差別
- handler發消息給子線程,looper怎么啟動?
- 關于Handler,在任何地方new Handler 都是什么線程下?
- ThreadLocal原理,實現及如何保證Local屬性?
- 請解釋下在單線程模型中Message、Handler、Message Queue、Looper之間的關系
- 請描述一下View事件傳遞分發機制
- Touch事件傳遞流程
- 事件分發中的onTouch 和onTouchEvent 有什么區別,又該如何使用?
- View和ViewGroup分別有哪些事件分發相關的回調方法
- View刷新機制
- View繪制流程
- 自定義控件原理
- 自定義View如何提供獲取View屬性的接口?
- Android代碼中實現WAP方式聯網
- AsyncTask機制
- AsyncTask原理及不足
- 如何取消AsyncTask?
- 為什么不能在子線程更新UI?
- ANR產生的原因是什么?
- ANR定位和修正
- oom是什么?
- 什么情況導致oom?
- 有什么解決方法可以避免OOM?
- Oom 是否可以try catch?為什么?
- 內存泄漏是什么?
- 什么情況導致內存泄漏?
- 如何防止線程的內存泄漏?
- 內存泄露場的解決方法
- 內存泄漏和內存溢出區別?
- LruCache默認緩存大小
- ContentProvider的權限管理(解答:讀寫分離,權限控制-精確到表級,URL控制)
- 如何通過廣播攔截和abort一條短信?
- 廣播是否可以請求網絡?
- 廣播引起anr的時間限制是多少?
- 計算一個view的嵌套層級
- Activity棧
- Android線程有沒有上限?
- 線程池有沒有上限?
- ListView重用的是什么?
- Android為什么引入Parcelable?
- 有沒有嘗試簡化Parcelable的使用?
四、開發中常見的一些問題
- ListView 中圖片錯位的問題是如何產生的?
- 混合開發有了解嗎?
- 知道哪些混合開發的方式?說出它們的優缺點和各自使用場景?(解答:比如:RN,weex,H5,小程序,WPA等。做Android的了解一些前端js等還是很有好處的);
- 屏幕適配的處理技巧都有哪些?
- 服務器只提供數據接收接口,在多線程或多進程條件下,如何保證數據的有序到達?
- 動態布局的理解
- 怎么去除重復代碼?
- 畫出 Android 的大體架構圖
- Recycleview和ListView的區別
- ListView圖片加載錯亂的原理和解決方案
- 動態權限適配方案,權限組的概念
- Android系統為什么會設計ContentProvider?
- 下拉狀態欄是不是影響activity的生命周期
- 如果在onStop的時候做了網絡請求,onResume的時候怎么恢復?
- Bitmap 使用時候注意什么?
- Bitmap的recycler()
- Android中開啟攝像頭的主要步驟
- ViewPager使用細節,如何設置成每次只初始化當前的Fragment,其他的不初始化?
- 點擊事件被攔截,但是想傳到下面的View,如何操作?
- 微信主頁面的實現方式
- 微信上消息小紅點的原理
- CAS介紹(這是阿里巴巴的面試題,我不是很了解,可以參考博客: CAS簡介)
高端技術面試題
這里講的是大公司需要用到的一些高端Android技術,這里專門整理了一個文檔,希望大家都可以看看。這些題目有點技術含量,需要好點時間去研究一下的。
一、圖片
- 圖片庫對比
- 圖片庫的源碼分析
- 圖片框架緩存實現
- LRUCache原理
- 圖片加載原理
- 自己去實現圖片庫,怎么做?
- Glide源碼解析
- Glide使用什么緩存?
- Glide內存緩存如何控制大小?
二、網絡和安全機制
- 網絡框架對比和源碼分析
- 自己去設計網絡請求框架,怎么做?
- okhttp源碼
- 網絡請求緩存處理,okhttp如何處理網絡緩存的
- 從網絡加載一個10M的圖片,說下注意事項
- TCP的3次握手和四次揮手
- TCP與UDP的區別
- TCP與UDP的應用
- HTTP協議
- HTTP1.0與2.0的區別
- HTTP報文結構
- HTTP與HTTPS的區別以及如何實現安全性
- 如何驗證證書的合法性?
- https中哪里用了對稱加密,哪里用了非對稱加密,對加密算法(如RSA)等是否有了解?
- client如何確定自己發送的消息被server收到?
- 談談你對WebSocket的理解
- WebSocket與socket的區別
- 談談你對安卓簽名的理解。
- 請解釋安卓為啥要加簽名機制?
- 視頻加密傳輸
- App 是如何沙箱化,為什么要這么做?
- 權限管理系統(底層的權限是如何進行 grant 的)?
三、數據庫
- sqlite升級,增加字段的語句
- 數據庫框架對比和源碼分析
- 數據庫的優化
- 數據庫數據遷移問題
四、算法
- 排序算法有哪些?
- 最快的排序算法是哪個?
- 手寫一個冒泡排序
- 手寫快速排序代碼
- 快速排序的過程、時間復雜度、空間復雜度
- 手寫堆排序
- 堆排序過程、時間復雜度及空間復雜度
- 寫出你所知道的排序算法及時空復雜度,穩定性
- 二叉樹給出根節點和目標節點,找出從根節點到目標節點的路徑
- 給阿里2萬多名員工按年齡排序應該選擇哪個算法?
- GC算法(各種算法的優缺點以及應用場景)
- 蟻群算法與蒙特卡洛算法
- 子串包含問題(KMP 算法)寫代碼實現
- 一個無序,不重復數組,輸出N個元素,使得N個元素的和相加為M,給出時間復雜度、空間復雜度。手寫算法
- 萬億級別的兩個URL文件A和B,如何求出A和B的差集C(提示:Bit映射->hash分組->多文件讀寫效率->磁盤尋址以及應用層面對尋址的優化)
- 百度POI中如何試下查找最近的商家功能(提示:坐標鏡像+R樹)。
- 兩個不重復的數組集合中,求共同的元素。
- 兩個不重復的數組集合中,這兩個集合都是海量數據,內存中放不下,怎么求共同的元素?
- 一個文件中有100萬個整數,由空格分開,在程序中判斷用戶輸入的整數是否在此文件中。說出最優的方法
- 一張Bitmap所占內存以及內存占用的計算
- 2000萬個整數,找出第五十大的數字?
- 燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鐘呢?
- 求1000以內的水仙花數以及40億以內的水仙花數
- 5枚硬幣,2正3反如何劃分為兩堆然后通過翻轉讓兩堆中正面向上的硬8幣和反面向上的硬幣個數相同
- 時針走一圈,時針分針重合幾次
- N*N的方格紙,里面有多少個正方形
- x個蘋果,一天只能吃一個、兩個、或者三個,問多少天可以吃完?
五、插件化、模塊化、組件化、熱修復、增量更新、Gradle
- 對熱修復和插件化的理解
- 插件化原理分析
- 模塊化實現(好處,原因)
- 熱修復,插件化
- 項目組件化的理解
- 描述清點擊 Android Studio 的 build 按鈕后發生了什么
六、架構設計和設計模式
- 談談你對Android設計模式的理解
- MVC MVP MVVM原理和區別
- 你所知道的設計模式有哪些?
- 項目中常用的設計模式
- 手寫生產者/消費者模式
- 寫出觀察者模式的代碼
- 適配器模式,裝飾者模式,外觀模式的異同?
- 用到的一些開源框架,介紹一個看過源碼的,內部實現過程。
- 談談對RxJava的理解
- RxJava的功能與原理實現
- RxJava的作用,與平時使用的異步操作來比的優缺點
- 說說EventBus作用,實現方式,代替EventBus的方式
- 從0設計一款App整體架構,如何去做?
- 說一款你認為當前比較火的應用并設計(比如:直播APP,P2P金融,小視頻等)
- 談談對java狀態機理解
- Fragment如果在Adapter中使用應該如何解耦?
- Binder機制及底層實現
- 對于應用更新這塊是如何做的?(解答:灰度,強制更新,分區域更新)?
- 實現一個Json解析器(可以通過正則提高速度)
- 統計啟動時長,標準
七、性能優化
- 如何對Android 應用進行性能分析以及優化?
- ddms 和 traceView
- 性能優化如何分析systrace?
- 用IDE如何分析內存泄漏?
- Java多線程引發的性能問題,怎么解決?
- 啟動頁白屏及黑屏解決?
- 啟動太慢怎么解決?
- 怎么保證應用啟動不卡頓?
- App啟動崩潰異常捕捉
- 自定義View注意事項
- 現在下載速度很慢,試從網絡協議的角度分析原因,并優化(提示:網絡的5層都可以涉及)。
- Https請求慢的解決辦法(提示:DNS,攜帶數據,直接訪問IP)
- 如何保持應用的穩定性
- RecyclerView和ListView的性能對比
- ListView的優化
- RecycleView優化
- View渲染
- Bitmap如何處理大圖,如一張30M的大圖,如何預防OOM
- java中的四種引用的區別以及使用場景
- 強引用置為null,會不會被回收?
八、NDK、jni、Binder、AIDL、進程通信有關
- 請介紹一下NDK
- 什么是NDK庫?
- jni用過嗎?
- 如何在jni中注冊native函數,有幾種注冊方式?
- Java如何調用c、c++語言?
- jni如何調用java層代碼?
- 進程間通信的方式?
- Binder機制
- 簡述IPC?
- 什么是AIDL?
- AIDL解決了什么問題?
- AIDL如何使用?
- Android 上的 Inter-Process-Communication 跨進程通信時如何工作的?
- 多進程場景遇見過么?
- Android進程分類?
- 進程和 Application 的生命周期?
- 進程調度
- 談談對進程共享和線程安全的認識
- 談談對多進程開發的理解以及多進程應用場景
- 什么是協程?
九、framework層、ROM定制、Ubuntu、Linux之類的問題
- java虛擬機的特性
- 談談對jvm的理解
- JVM內存區域,開線程影響哪塊內存
- 對Dalvik、ART虛擬機有什么了解?
- Art和Dalvik對比
- 虛擬機原理,如何自己設計一個虛擬機(內存管理,類加載,雙親委派)
- 談談你對雙親委派模型理解
- JVM內存模型,內存區域
- 類加載機制
- 談談對ClassLoader(類加載器)的理解
- 談談對動態加載(OSGI)的理解
- 內存對象的循環引用及避免
- 內存回收機制、GC回收策略、GC原理時機以及GC對象
- 垃圾回收機制與調用System.gc()區別
- Ubuntu編譯安卓系統
- 系統啟動流程是什么?(提示:Zygote進程 –> SystemServer進程 –> 各種系統服務 –> 應用進程)
- 大體說清一個應用程序安裝到手機上時發生了什么
- 簡述Activity啟動全部過程
- App啟動流程,從點擊桌面開始
- 邏輯地址與物理地址,為什么使用邏輯地址?
- Android為每個應用程序分配的內存大小是多少?
- Android中進程內存的分配,能不能自己分配定額內存?
- 進程保活的方式
- 如何保證一個后臺服務不被殺死?(相同問題:如何保證service在后臺不被kill?)比較省電的方式是什么?
- App中喚醒其他進程的實現方式
非技術性問題&HR問題匯總
這里整理的是一些與技術沒有直接關系的面試題,但是能夠考察你的綜合水平,所以不要以為不是技術問題,就不看,往往有時候就是這樣一些細節的題目被忽視,而錯過了一次次面試機會。
非技術問題
- 介紹你做過的哪些項目
- 都使用過哪些框架、平臺?
- 都使用過哪些自定義控件?
- 研究比較深入的領域有哪些?
- 對業內信息的關注渠道有哪些?
- 最近都讀哪些書?
- 有沒有什么開源項目?
- 自己最擅長的技術點,最感興趣的技術領域和技術點
- 項目中用了哪些開源庫,如何避免因為引入開源庫而導致的安全性和穩定性問題
- 實習過程中做了什么,有什么產出?
HR提出的面試問題
- 您在前一家公司的離職原因是什么?
- 講一件你印象最深的一件事情
- 介紹一個你影響最深的項目
- 介紹你最熱愛最擅長的專業領域
- 公司實習最大的收獲是什么?
- 與上級意見不一致時,你將怎么辦?
- 自己的優點和缺點是什么?并舉例說明?
- 你的學習方法是什么樣的?實習過程中如何學習?實習項目中遇到的最大困難是什么以及如何解決的?
- 說一件最能證明你能力的事情
- 針對你你申請的這個職位,你認為你還欠缺什么
- 如果通過這次面試我們單位錄用了你,但工作一段時間卻發現你根本不適合這個職位,你怎么辦?
- 項目中遇到最大的困難是什么?如何解決的?
- 你的職業規劃以及個人目標、未來發展路線及求職定位
- 如果你在這次面試中沒有被錄用,你怎么打算?
- 評價下自己,評價下自己的技術水平,個人代碼量如何?
- 通過哪些渠道了解的招聘信息,其他同學都投了哪些公司?
- 業余都有哪些愛好?
- 你做過的哪件事最令自己感到驕傲?
- 假如你晚上要去送一個出國的同學去機場,可單位臨時有事非你辦不可,你怎么辦?
- 就你申請的這個職位,你認為你還欠缺什么?
- 當前的offer狀況;如果BATH都給了offer該如何選?
- 你對一份工作更看重哪些方面?平臺,技術,氛圍,城市,還是money?
- 理想薪資范圍;杭州崗和北京崗選哪個?
- 理想中的工作環境是什么?
- 談談你對跳槽的看法
- 說說你對行業、技術發展趨勢的看法
- 實習過程中周圍同事/同學有哪些值得學習的地方?
- 家人對你的工作期望及自己的工作期望
- 如果你的工作出現失誤,給本公司造成經濟損失,你認為該怎么辦?
- 若上司在公開會議上誤會你了,該如何解決?
- 是否可以實習,可以實習多久?
- 在五年的時間內,你的職業規劃
- 你看中公司的什么?或者公司的那些方面最吸引你?
~~~~~~~~~~~~~~~~~~~~~~~ 我是華麗的分割線 ~~~~~~~~~~~~~~~~~~~~~~~
下面的這部分來自小楠總的博客 https://www.jianshu.com/p/b5ba11275a6d
一、基礎知識
1. 虛擬機相關知識基礎
重點關注:
這里推薦筆者的文章:
2. Java基礎:
尤其需要深入理解容器、I/O、線程、反射、泛型等。尤其是容器的源碼實現。
相關文章網上比較多,筆者只推薦一小部分:
3. Kotlin基礎
這里推薦:
4. 數據結構與算法
這里重點關注:
推薦:
5. 操作系統基礎與計算機網絡
這個就不用作太多介紹了,大學的基礎課。
其中,值得注意的是:
最后,還是推薦微信公眾號『碼個蛋』特約作者–Ruhenghttp://www.jianshu.com/u/0fa6f5d09040
6. 設計原則與設計模式、架構
推薦:
7. 版本控制與持續集成、自動化構建、Gradle
二、Android常問知識篇
Android基礎就不再贅述了,相信大家都比較熟悉,找一個系列的博客或者買本書籍補習即可,也推薦去看黑馬的Android視頻。重點關注四大組件的生命周期、Activity啟動模式、Service等等。
推薦:
下面主要介紹一下Android基礎知識以外的。
1. Android系統架構、源碼分析
招聘信息上面經常寫“熟悉Android系統架構”、還會經常被問“有沒有看過什么源碼”,那么到底什么是系統架構呢,參考文章:
注:作為Android APP開發人員,源碼不必深入掌握代碼每個細節。但是有些東西,掌握了就會加深對Android的理解,這就是源碼的魅力所在,它深深地吸引著筆者。這也是區分各位應聘者的門檻。
至于其它的一般的框架源碼的話,例如:
這些其實都應該重點關注一下的,面試的時候大致能夠說出一個流程或者原理。側重點看什么需要根據公司而定,如果公司是搞電商的,那么網絡請求、圖片加載肯定少不了。
每樣挑一個比較牛逼、或者比較新的框架去研究即可。最好其它框架也要懂個大致的原理、會使用。
2. 新技術
學習一些插件化、熱修復框架,Android路由、組件化、異步框架、新的動畫框架。
例如:
以上只是列出一些比較常見、比較新的框架,具體深入修行需要靠個人。應付面試的話,只需要大致能說出原理、使用體驗過也就差不多了。資料網上比較多,就不逐個推薦了。
3. 性能優化
性能優化也是Android面試中常問的點,這里推薦一些相關資料:
4. 自定義View與動畫
這是Android中比較難的一部分知識,需要平時就不斷積累、鍛煉,相關的文章比較多,就不推薦了。
這里推薦扔物線大神的自定義View文章:http://hencoder.com/ui-1-1/
5. NDK開發(含JNI)
NDK開發也是用人單位區分應聘者的手段之一,企業不一定要用到,但是可以通過是否掌握NDK來篩選人才。相對來說,大公司比較喜歡使用NDK技術。
相關推薦文章:
注:如果想去手機廠商的話,最好懂一些Linux的基本命令、adb命令、Ubuntu/MAC的使用
6. 項目實戰
三、手寫題目篇
這里推薦大家上牛客網https://www.nowcoder.com/刷題,筆試離不開上面的基礎知識的積累,因此這里不再贅述。
~~~~~~~~~~~~~~~~~~~~分割線~~~~~~~~~~~~~~~~~~~~
忘記出處了,對不住了啊
四、補充題
- 基礎知識 – 四大組件(生命周期,使用場景,如何啟動)
- java基礎 – 數據結構,線程,mvc框架
- 通信 – 網絡連接(HttpClient,HttpUrlConnetion),Socket
- 數據持久化 – SQLite,SharedPreferences,ContentProvider
- 性能優化 – 布局優化,內存優化,電量優化
- 安全 – 數據加密,代碼混淆,WebView/Js調用,https
- UI– 動畫
- 其他 – JNI,AIDL,Handler,Intent等
- 開源框架 – Volley,Gilde,RxJava等(簡歷上寫你會的,用過的)
- 拓展 – Android6.0/7.0/8.0特性,kotlin語言,I/O大會
順序是根據記憶排的,沒有優先級之分,都是重點。(固定答案不解答,自己可以找到)
1.Activity的啟動過程(不要回答生命周期)
http://blog.csdn.net/luoshengyang/article/details/6689748
2.Activity的啟動模式以及使用場景
(1)manifest設置,(2)startActivity flag
http://blog.csdn.net/CodeEmperor/article/details/50481726
此處延伸:棧(First In Last Out)與隊列(First In First Out)的區別
3.Service的兩種啟動方式
(1)startService(),(2)bindService()
http://www.jianshu.com/p/2fb6eb14fdec
4.Broadcast注冊方式與區別
(1)靜態注冊(minifest),(2)動態注冊
http://www.jianshu.com/p/ea5e233d9f43
此處延伸:什么情況下用動態注冊
5.HttpClient與HttpUrlConnection的區別
http://blog.csdn.net/guolin_blog/article/details/12452307
此處延伸:Volley里用的哪種請求方式(2.3前HttpClient,2.3后HttpUrlConnection)
6.http與https的區別
http://blog.csdn.net/whatday/article/details/38147103
此處延伸:https的實現原理
7.http與https的區別
http://blog.csdn.net/whatday/article/details/38147103
此處延伸:https的實現原理
8.手寫算法(選擇冒泡必須要會)
http://www.jianshu.com/p/ae97c3ceea8d
9.進程保活(不死進程)
http://www.jianshu.com/p/63aafe3c12af
此處延伸:進程的優先級是什么(下面這篇文章,都有說)
https://segmentfault.com/a/1190000006251859
10.進程間通信的方式
(1)AIDL,(2)廣播,(3)Messenger
AIDL : http://www.jianshu.com/p/ae97c3ceea8d
Messenger : http://blog.csdn.net/lmj623565791/article/details/47017485
此處延伸:簡述Binder , http://blog.csdn.net/luoshengyang/article/details/6618363/
11.加載大圖
PS:有家小公司(規模寫假的,給騙過去了),直接把項目給我看,讓我說實現原理。。
最讓我無語的一次面試,就一個點問的我底褲都快穿了,就差幫他們寫代碼了。。
http://blog.csdn.net/lmj623565791/article/details/49300989
12.三級緩存(各大圖片框架都可以扯到這上面來)
(1)內存緩存,(2)本地緩存,(3)網絡
內存:http://blog.csdn.net/guolin_blog/article/details/9526203
本地:http://blog.csdn.net/guolin_blog/article/details/28863651
13.MVP框架(必問)
http://blog.csdn.net/lmj623565791/article/details/46596109
此處延伸:手寫mvp例子,與mvc之間的區別,mvp的優勢
14.講解一下Context
http://blog.csdn.net/lmj623565791/article/details/40481055
15.JNI
http://www.jianshu.com/p/aba734d5b5cd
此處延伸:項目中使用JNI的地方,如:核心邏輯,密鑰,加密邏輯
16.java虛擬機和Dalvik虛擬機的區別
http://www.jianshu.com/p/923aebd31b65
17.線程sleep和wait有什么區別
http://blog.csdn.net/liuzhenwen/article/details/4202967
18.View,ViewGroup事件分發
http://blog.csdn.net/guolin_blog/article/details/9097463
http://blog.csdn.net/guolin_blog/article/details/9153747
19.保存Activity狀態
onSaveInstanceState()
http://blog.csdn.net/yuzhiboyi/article/details/7677026
20.WebView與js交互(調用哪些API)
http://blog.csdn.net/cappuccinolau/article/details/8262821/
21.內存泄露檢測,內存性能優化
http://blog.csdn.net/guolin_blog/article/details/42238627
這篇文章有四篇,很詳細。
此處延伸:
(1)內存溢出(OOM)和內存泄露(對象無法被回收)的區別。
(2)引起內存泄露的原因
22.布局優化
http://blog.csdn.net/guolin_blog/article/details/43376527
23.自定義view和動畫
以下兩個講解都講得很透徹,這部分面試官多數不會問很深,要么就給你一個效果讓你講原理。
(1)http://www.gcssloop.com/customview/CustomViewIndex
(2)http://blog.csdn.net/yanbober/article/details/50577855
24.設計模式(單例,工廠,觀察者。作用,使用場景)
一般說自己會的就ok,不要只記得名字就一輪嘴說出來,不然有你好受。
http://blog.csdn.net/jason0539/article/details/23297037/
此處延伸:Double Check的寫法被要求寫出來。
25.String,Stringbuffer,Stringbuilder 區別
http://blog.csdn.net/kingzone_2008/article/details/9220691
26.開源框架,為什么使用,與別的有什么區別
這個問題基本必問。在自己簡歷上寫什么框架,他就會問什么。
如:Volley,面試官會問我Volley的實現原理,與okhttp和retrofit的區別。
開源框架很多,我就選幾個多數公司都會用的出來(框架都是針對業務和性能,所以不一定出名的框架就有人用)
網絡請求:Volley,okhttp,retrofit
異步:RxJava,AsyncTask
圖片處理:Picasso,Glide
消息傳遞:EventBus
以上框架請自行查找,太多了就不貼出來了。
27.RecyclerView
這個挺搞笑的。有另外一個同事也在找工作,面試官嫌他沒用過RecyclerView直接pass掉。
http://blog.csdn.net/lmj623565791/article/details/45059587
OK,點到即止。
五、接著補充
01、Activity生命周期?
這幾乎是個老少咸宜,永遠不會過時的問題,而且極有可能是第一個問題。這個問題當然沒什么好講的啦,死記硬背是沒什么用的了,關鍵是理解。本人就曾遇到這個問題的變種問題,問onStart(),與onResume()有什么區別?如果面試官拋出這個問題,是不是有點措手不及。今天又聽說有同學遭遇了更變態的問題:什么情況下Activity走了onCreat(),而不走onStart(),這簡直就是腦筋急轉彎嘛。
02、Service生命周期?
這里要注意service有兩種啟動方式,startService()和bindService()
03、理解Activity,View,Window三者關系
這個問題真的很不好回答。所以這里先來個算是比較恰當的比喻來形容下它們的關系吧。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等。
04、四種LaunchMode及其使用場景
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。
05、View的繪制流程
measure過程
layout過程
draw過程
從此再有不愁自定義View——Android自定義view詳解
android View繪制源碼分析(上)
android View繪制源碼分析(下)
06、Touch事件傳遞機制
public boolean dispatchTouchEvent(MotionEventev); //用來分派event public boolean onInterceptTouchEvent(MotionEventev); //用來攔截event public boolean onTouchEvent(MotionEventev); //用來處理event- 1
- 2
- 3
- 4
- 5
- 6
- 7
其中Activity和View控件(TextView)擁有分派和處理事件方法,View容器(LinearLayout)具有分派,攔截,處理事件方法。這里也有個比喻:領導都會把任務向下分派,一旦下面的人把事情做不好,就不會再把后續的任務交給下面的人來做了,只能自己親自做,如果自己也做不了,就只能告訴上級不能完成任務,上級又會重復他的過程。另外,領導都有權利攔截任務,對下級隱瞞該任務,而直接自己去做,如果做不成,也只能向上級報告不能完成任務。
http://gold.xitu.io/entry/56af0ba0c24aa800547b60ea
07、Android中的幾種動畫
曾被問到Android中有幾種動畫,這個問題也好難回答。Android3.0之前有2種,3.0后有3種。
FrameAnimation(逐幀動畫):將多張圖片組合起來進行播放,類似于早期電影的工作原理,很多App的loading是采用這種方式。
TweenAnimation(補間動畫):是對某個View進行一系列的動畫的操作,包括淡入淡出(Alpha),縮放(Scale),平移(Translate),旋轉(Rotate)四種模式。
PropertyAnimation(屬性動畫):屬性動畫不再僅僅是一種視覺效果了,而是一種不斷地對值進行操作的機制,并將值賦到指定對象的指定屬性上,可以是任意對象的任意屬性。
Android 動畫,看完這些就夠了(上)
Android 動畫,看完這些就夠了(下)
http://blog.csdn.net/yanbober/article/details/46481171
08、Android中跨進程通訊的幾種方式
1:訪問其他應用程序的Activity
如調用系統通話應用
- 1
- 2
- 3
2:Content Provider
如訪問系統相冊
3:廣播(Broadcast)
如顯示系統時間
4:AIDL服務
09、AIDL理解
http://bbs.51cto.com/thread-1086040-1.html
10、Handler的原理
IntentService——Handler與Service的結合
Android 開發中利用異步來優化運行速度和性能
深入理解ThreadLocal(一)
http://blog.csdn.net/lmj623565791/article/details/38377229
11、Binder機制原理
為什么 Android 要采用 Binder 作為 IPC 機制?
http://blog.csdn.net/boyupeng/article/details/47011383
12、熱修復的原理
1:JavaSisst
2:AspectJ
3:Xposef
阿里Android熱修復技術選型——三大流派解析
Android 熱修復方案分析
Android熱更新:美團大眾點評Android熱更新方案Robust
Android插件化之使用AndFix進行Hot fix
13、設計一套圖片異步加載緩存方案
http://www.cnblogs.com/zyw-205520/p/4997863.html
http://blog.csdn.net/boyupeng/article/details/47127605
14、Android內存泄露及管理
Android內存泄漏研究
Android 內存泄漏總結(下)
Android內存性能優化(內部資料總結)
Android性能優化-內存泄露的檢查與處理
5個Android開發中比較常見的內存泄漏問題及解決辦法
Android內存泄漏問題定位與解決實際案例
【干貨】Android內存泄漏分析實戰和心得-面試常考點
再談android內存泄漏—常見的八種導致 APP 內存泄漏的問題
最全最系統的 Android 界面性能調優資料
http://gold.xitu.io/entry/56d64b9e816dfa005943a55c
15、Activity和Fragment通信
[干貨]讓你徹底搞懂Context到底是什么,如果沒弄明白,還怎么做Android開發?
http://gold.xitu.io/entry/56a87b2b2e958a0051906227
16、Fragment的那些坑
http://www.jianshu.com/p/d9143a92ad94
http://www.jianshu.com/p/fd71d65f0ec6
http://www.jianshu.com/p/38f7994faa6b
17、Android UI適配
Android UI布局問題總結
擁抱SVG:苦惱于圖片適配 in Android?萬能圖片適配
http://blog.csdn.net/lmj623565791/article/details/45460089
18、布局優化
Anroid性能優化系列——Improving Layout Performance(一)
Anroid性能優化系列——Improving Layout Performance(二)
Anroid性能優化系列——Improving Layout Performance(三)
性能優化之布局優化
Android布局優化之實用技巧
Android 高效布局的幾點建議
Google I/O 2016 上發布的 ConstraintLayout是什么東東?Android Layout新世界
Android UI布局問題總結
Android中RelativeLayout和LinearLayout性能分析
Android布局優化之過度繪制
http://www.jianshu.com/p/145fc61011cd
19、Http https
常見通信協議HTTP、TCP、UDP的簡單介紹
從日常開發說起,淺談HTTP協議是做什么的
最詳細的 HTTPS 介紹
詳解https是如何確保安全的?
http://www.jianshu.com/p/93fdebe5fef1
20、網絡請求優化
攜程App的網絡性能優化實踐
Android推送技術研究
http://www.jianshu.com/p/3141d4e46240
21、數據庫優化
Android上SQLite的性能優化問題
淺析SQLite的鎖機制和WAL技術
http://www.jianshu.com/p/3b4452fc1bbd
22、圖片優化
Android 三大圖片緩存原理、特性對比
史上最全最詳細的Facebook的強大Android圖片加載的框架Fresco講解
初識Facebook的強大Android圖片加載的框架:Fresco
擁抱SVG:苦惱于圖片適配 in Android?萬能圖片適配
http://www.jianshu.com/p/5bb8c01e2bc7
23、HybridJAVA和JS交互
好好和h5溝通!幾種常見的hybrid通信方式
從Ionic粗窺混合模式的手機APP開發
豆瓣混合開發實踐
http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/
24、單例設計模式
設計模式之單例詳解
25、JAVA GC原理
Android內存泄漏研究
理解Android虛擬機體系結構
JVM內幕:Java虛擬機詳解
http://www.jianshu.com/p/d75a32ac5bed?
26、ANR
Android性能優化系列—避免ANR
http://www.jianshu.com/p/124f3b75e164
27
Volley
基于MVP架構、MD風格的Dribbble客戶端
http://www.jianshu.com/p/9e17727f31a1
28、JAVA注解反射原理
http://www.jianshu.com/p/3968ffabdf9d
29、算法
程序員必須知道的10大基礎實用算法及其講解
算法趣談—漫畫:判斷 2 的乘方-算法學習不再枯燥
【趣談算法系列】:無序數組排序后的最大相鄰差值
http://www.jianshu.com/p/ae97c3ceea8d
30、設計模式
設計模式之Adapter
觀察者模式學習小結
設計模式之單例詳解
“備忘錄模式”就這么簡單
Android App的設計架構:MVC,MVP,MVVM與架構經驗談
http://gold.xitu.io/entry/56ebb4ad5bbb50004c440972
31、RxJava
使用RxJava構造Android清晰框架
Airbnb:我們的安卓客戶端是如何使用 RxJava 的
一個很棒的 Android APP框架
http://gank.io/post/560e15be2dca930e00da1083?from=timeline&isappinstalled=0#toc_1
32、MVP,MVC,MVVM
Android官方MVP架構示例項目解析
Android官方MVP架構示例項目解讀
Android App的設計架構:MVC,MVP,MVVM與架構經驗談
淺談 Android 編程思想和架構
APP重構:Android實踐從MVC架構到MVP架構
Android開源實戰:使用MVP+Retrofit開發一款文字閱讀APP
http://blog.csdn.net/pkxiuluo01/article/details/49383783
33
React Native跨平臺技術
科普React Native-目前最火的前端技術
React Native for Android 接入實踐
https://mp.weixin.qq.com/s/i0DWHR2eQmNijXTQv3YGmQ
35、Android 5.0
MD風格
基于MVP架構、MD風格的Dribbble客戶端
基于Retrotfit2.1+Material Design+ijkplayer開發的一個APP(新聞,gif 動圖,視頻播放)
http://www.androidchina.net/1381.html
36、Android6.0運行時權限
Android6.0權限適配,比你想的還要簡單(實踐篇)
Android 6.0(API級別23)包括各種系統變化和API的行為變化
Android6.0觸摸事件分發機制解讀
https://mp.weixin.qq.com/s/R2sAthMB2yW3ytTesnT-Jw
37、Android7.0新特性
Android 7.0新特性總結,快看Google又有什么出人意料的東西?
Android7.0適配教程與心得
Android N最令人期待的10大新功能
http://blog.csdn.net/wds1181977/article/details/52292445
38、Android插件化和組合化開發
Android插件化之使用AndFix進行Hot fix
Android分包原理
Android插件化的一種實現
插件化的基石之apk動態加載
途牛原創|途牛Android App的插件實現
http://www.cnblogs.com/android-blogs/p/5703355.html
六、常見題及答案
- 請描述一下Activity 生命周期。
答: 如下圖所示。共有七個周期函數,按順序分別是: onCreate(), onStart(), onRestart(), onResume(), onPause(),onStop(), onDestroy()。
onCreate(): 創建Activity時調用,設置在該方法中,還以Bundle的形式提供對以前存儲的任何狀態的訪問。
onStart(): Activity變為在屏幕上對用戶可見時調用。
onResume(): Activity開始與用戶交互時調用(無論是啟動還是重新啟動一個活動,該方法總是被調用。
onPause(): Activity被暫停或收回cpu和其他資源時調用,該方法用戶保護活動狀態的,也是保護現場。
onStop(): Activity被停止并轉為不可見階段及后續的生命周期事件時調用。
onRestart(): Activity被重新啟動時調用。該活動仍然在棧中,而不是啟動新的Activity。
1、完整生命周期: 即從一個Activity從出現到消失,對應的周期方法是從onCreate()到onDestroy()。
2、可見生命周期: 當Activity處于可以用戶看見的狀態,但不一定能與用戶交互時,將多次執行從onStart()到onStop()。
3、前景生命周期: 當Activity處于Activity棧最頂端,能夠與其他用戶進行交互時,將多次執行從onResume()到onPause()。
- 兩個Activity之間跳轉時必然會執行的是哪幾個方法。
答: 兩個Activity之間跳轉必然會執行的是下面幾個方法。
onCreate()//在Activity生命周期開始時調用。
onRestoreInstanceState()//用來恢復UI狀態。
onRestart()//當Activity重新啟動時調用。
onStart()//當Activity對用戶即將可見時調用。
onResume()//當Activity與用戶交互時,繪制界面。
onSaveInstanceState()//即將移出棧頂保留UI狀態時調用。
onPause()//暫停當前活動Activity,提交持久數據的改變,停止動畫或其他占用GPU資源的東西,由于下一個Activity在這個方法返回之前不會resume,所以這個方法的代碼執行要快。
onStop()//Activity不再可見時調用。
onDestroy()//Activity銷毀棧時被調用的最后一個方法。
- 橫豎屏切換時候Activity的生命周期。
答:
1、不設置Activity的android: configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次。
2、設置Activity的android: configChanges=“orientation”時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次。
3、設置Activity的android: configChanges=“orientation|keyboardHidden”時,切屏不會重新調用各個生命周期,只會執行onConfiguration方法
- 如何將一個Activity設置成窗口的樣式。
答: 第一種方法,在styles.xml文件中,可以新建如下的類似Dialog的style。
。
第二種方法,在AndroidManifest.xml中在需要顯示為窗口的Activity中添加如下屬性: android: theme=“@style/Theme.FloatActivity”即可。也可以直接添加對應需要展示為Dialog style的Activity的android: theme屬性為android: theme=“@ android: style/Theme.Dialog”。
- 兩個Activity之間怎么傳遞數據?
答: 可以在Intent對象中利用Extra來傳遞存儲數據。
在Intent的對象請求中,使用putExtra(“鍵值對的名字”,”鍵值對的值”);在另外一個Activity中將Intent中的請求數據取出來:
Intent intent = getIntent();
String value = intent.getStringExtra(“testIntent”);
- 怎么讓在啟動一個Activity是就啟動一個service?
答: 首先定義好一個service,然后在Activity的onCreate里面進行連接并bindservice或者直接startService。
- Activity怎么和service綁定,怎么在activity中啟動自己對應的service?
答:
1、activity能進行綁定得益于Serviece的接口。為了支持Service的綁定,實現onBind方法。
2、Service和Activity的連接可以用ServiceConnection來實現。需要實現一個新的ServiceConnection,重現onServiceConnected和OnServiceDisconnected方法,一旦連接建立,就能得到Service實例的引用。
3、執行綁定,調用bindService方法,傳入一個選擇了要綁定的Service的Intent(顯示或隱式)和一個你實現了的ServiceConnection的實例
- 什么是Service以及描述下它的生命周期。Service有哪些啟動方法,有什么區別,怎樣停用Service?
答: Android Service是運行在后臺的代碼,不能與用戶交互,可以運行在自己的進程,也可以運行在其他應用程序進程的上下文里。需要通過某一個Activity或者Context對象來調用。Service有兩個啟動方法,分別是Context.startService()和Context.bindService()。如果在Service執行耗時的操作需要啟動一個新線程來執行。
Android Service只繼承了onCreate(), onStart(),onDestroy()三個方法,當我們第一次啟動Service時,先后調用onCreate(), onStart()這兩個方法,當停止Service時,則執行onDestroy()方法時。如果Service已經啟動了,當我們再次啟動Service時,不會再執行onCreate()方法,而是直接執行onStart()方法。
- 什么時候使用Service?
答: 比如播放多媒體的時候,用戶啟動了其他Activity,這個時候程序要在后臺繼續播放,比如檢測SD卡上文件的變化,再或者在后臺記錄你的地理信息位置的改變等等。
- 請描述一下Intent 和 Intent Filter。
答: Intent在Android中被翻譯為”意圖”,他是三種應用程序基本組件-Activity,Service和broadcast receiver之間相互激活的手段。在調用Intent名稱時使用ComponentName也就是類的全名時為顯示調用。這種方式一般用于應用程序的內部調用,因為你不一定會知道別人寫的類的全名。而Intent Filter是指意圖過濾,不出現在代碼中,而是出現在android Manifest文件中,以的形式。(有一個例外是broadcast receiver的intent
filter是使用Context.registerReceiver()來動態設定的,其中intent filter也是在代碼中創建的)
一個intent有action,data,category等字段。一個隱式intent為了能夠被某個intent filter接收,必須通過3個測試,一個intent為了被某個組件接收,則必須通過它所有的intent filter中的一個。
- Intent傳遞數據時,可以傳遞哪些類型數據?
答: intent間傳送數據一般有兩種常用的方法: 1、extra 2、data。
extra可以用Intent.putExtra放入數據。新啟動的Activity可用Intent.getExtras取出Bundle,然后用Bundles.getLong,getInt,getBoolean,getString等函數來取放進去的值。
Data則是傳輸url。url可以是指我們熟悉的http,ftp等網絡地址,也可以指content來指向ContentProvider提供的資源。Intent.setData可以放入數據,Intent.getData可以取出數據。
- 說說Activity,Intent,Service是什么關系 ?
答: 一個Activity通常是一個單獨的屏幕,每一個Activity都被實現為一個單獨的類,這些類都是從Activity基類中繼承而來的。Activity類會顯示由視圖控件組成的用戶接口,并對視圖控件的事件做出響應。
Intent的調用是用來進行屏幕之間的切換。Intent描述應用想要做什么。Intent數據結構中兩個最重要的部分是動作和動作對應的數據,一個動作對應一個動作數據。
Service是運行在后臺的代碼,不能與用戶交互,可以運行在自己的進程里,也可以運行在其他應用程序進程的上下文里。需要一個Activity或者其他Context對象來調用。
Activity跳轉Activity,Activity啟動Service,Service打開Activity都需要Intent表明意圖,以及傳遞參數,Intent是這些組件間信號傳遞的承載著。
- 請描述一下BroadcastReceiver。
答: Broadcast Receiver用于接收并處理廣播通知(broadcast announcements)。多數的廣播是系統發起的,如地域變換、電量不足、來電短信等。程序也可以播放一個廣播。程序可以有任意數量的broadcast receivers來響應它覺得重要的通知。Broadcast receiver可以通過多種方式通知用戶: 啟動activity、使用NotificationManager、開啟背景燈、振動設備、播放聲音等,最典型的是在狀態欄顯示一個圖標,這樣用戶就可以點它打開看通知內容。通常我們的某個應用或系統本身在某些事件(電池電量不足、來電短信)來臨時會廣播一個Intent出去,我們利用注冊一個broadcast
receiver來監聽這些Intent并獲取Intent中的數據。
- 在manifest和代碼中如何注冊和使用 broadcast receiver 。
答: 在android的manifest中注冊
<receiver android: name =“Receiver1”>? <intent-filter>? <!----和Intent中的action對應--->? <actionandroid: name=“com.forrest.action.mybroadcast”/>? </intent-filter> </receiver>- 1
- 2
- 3
- 4
- 5
- 6
在代碼中注冊
1、 IntentFilter filter = new IntentFilter(“com.forrest.action.mybroadcast”);//和廣播中Intent的action對應;
2、 MyBroadcastReceiver br= new MyBroadcastReceiver();
3、 registerReceiver(br, filter);
- 請介紹下ContentProvider是如何實現數據共享的。
答: 一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content provider是以類似數據庫中的表的方式將自己的數據暴露。Content provider存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。
要想使應用程序的數據公開化,可通過2種方法:創建一個數據自己的Content Provider或者將你的數據添加到一個已經存在的Content Provider中,前提是有相同數據類型并且有寫入Content Provider的權限,Android提供了Content Resolverr,外界的程序可以通過Content Resolver接口訪問Content Provider提供的數據。
- 請介紹下Android的數據存儲方式。
答: Android提供了5中存儲數據的方式,分別是以下幾種
1、使用Shared Preferences存儲數據,用來存儲key-value,pairs格式的數據,它是一個輕量級的鍵值存儲機制,只可以存儲基本數據類型。
2、使用文件存儲數據,通過FileInputStream和FileOutputStream對文件進行操作。在Android中,文件是一個應用程序私有的,一個應用程序無法讀寫其他應用程序的文件。
3、使用SQLite數據庫存儲數據,Android提供的一個標準數據庫,支持SQL語句。
4、使用Content Provider存儲數據,是所有應用程序之間數據存儲和檢索的一個橋梁,它的作用就是使得各個應用程序之間實現數據共享。它是一個特殊的存儲數據的類型,它提供了一套標準的接口用來獲取數據,操作數據。系統也提供了音頻、視頻、圖像和個人信息等幾個常用的Content Provider。如果你想公開自己的私有數據,可以創建自己的Content Provider類,或者當你對這些數據擁有控制寫入的權限時,將這些數據添加到Content Provider中實現共享。外部訪問通過Content Resolver去訪問并操作這些被暴露的數據。
5、使用網絡存儲數據
- 請介紹下Android中常用的五種布局。
答: 最常用的布局方式為Absolute Layout、Relative Layout、Linear Layout、FrameLayout、TableLayout。其中Linear Layout和Relative Layout是最常用的方式,他們可以通過在xml配置文件或者代碼中進行布局。
1、Frame Layout是最簡單的布局方式,放置的控件都只能羅列到左上角,控件會有重疊,不能進行復雜的布局。
2、Linear Layout可以通過orientation屬性設置線性排列的方向是垂直還是縱向的,每行或每列只有一個元素,可以進行復雜的布局。
3、Absolute Layout可以讓子元素指定準確的x、y坐標值,并顯示在屏幕上。Absolute Layout沒有頁邊框,允許元素之間相互重疊。它是絕對坐標,所以在實際中不提倡使用。
4、Relative Layout允許子元素制定他們相對于其他元素或父元素的位置(通過ID制定)。因此,你可以以右對齊,或上下,或置于屏幕中央的形式來排列兩個元素。元素按順序排列,因此如果第一個元素在屏幕的中央,那么相對于這個元素的其他元素將以屏幕中央的相對位置來排列。這個是相對于Absolute Layout的,采用相對坐標,所以在實際中比較常用。
5、Table Layout將以子元素的位置分配到行或列。一個Table Layout由許多的Table Row組成,每個Table Row都會定義一個row。Table Layout容器不會顯示row、column或者cell的邊線框。每個row擁有0個或多個的cell; 和html中的table差不多。在實際中也經常使用。
- 談談UI中, Padding和Margin有什么區別?
答: Padding是控件的內容相對控件的邊緣的邊距,而Margin是控件邊緣相對于其他控件的邊距。如下圖所示:
- android本身的一些限制,比如apk包大小限制,讀取大文件時的時間限。
答:apk包大小限制不好說,有的apk為100M,還是能裝到手機上。一般的apk大小為5~10M左右。讀取大文件的時間應該是在main線程里面,時間限制為5秒左右。
- ListView如何提高其效率?
答:1、使用分頁加載,不要一次性加載所有數據。
2、復用convertView。在getItemView中,判斷converView是否為空,如果不為空,可復用。
3、異步加載圖片。Item中如果包含有webimage,那么最好異步加載。
4、快速滑動時,不顯示圖片。當快速滑動列表(SCROLL_STATE_FLING),item中的圖片或獲取需要消耗資源的view,可以不顯示出來;而處于其他兩種狀態(SCROLL_STATE_IDLE和SCROLL_STATE_TOUCH_SCROLL),則將那些view顯示出來
- Android程序與Java程序的區別?
| 執行入口點 | Main | Android Mainfest.xml配置文件中的intent-filter |
| UI | Frame· | Activity |
| 是否基于配置文件 | 否 | 是 |
| 是否基于組件 | 否 | 是Activity,Service,Broadcast Receiver,Content Provider |
- 談談對Android NDK的理解。
答: android NDK是一套工具,允許Android應用開發者嵌入從C、C++源代碼編譯來的本地機器代碼到各自的應用軟件包中。
1、 NDK是一系列工具的集合。
NDK提供了一系列的工具,幫助開發者快速開發C(或C++)的動態庫,并能自動將so和java應用一起打包成apk。這些工具對開發者幫助時巨大的。
NDK集成了交叉編輯器,并提供了相應的mk文件隔離CPU、平臺、API等差異,開發人員只需要簡單修改mk文件(指出“那些文件需要編譯”、“編譯特性要求”等),就可以創建出so。NDK可以自動將so和Java應用一起打包,極大的減輕了開發人員的打包工作。
2、NDK提供了一份穩定、功能有限的API頭文件聲明。這些API支持的功能非常有限,包含有:C標準庫(libc)、標準數學庫(libm)、壓縮庫(libz)、log庫(liblog)。
- 談談Android的優點和不足之處。
答: 優點如下所示:
1、android是開源、市場占有率大。
2、android能夠有豐富的硬件選擇。
3、android是一款基于Linux平臺的開源操作系統,從而避免了專利壁壘,是一款完全免費的只能手機平臺。
4、由于android是google開發的,因此能夠無縫結合Google應用。
缺點如下所示:
1、安全與隱私。手機與互聯網緊密聯系,個人隱私很難得到保守。
- Android系統中GC什么情況下會出現內存泄露呢?
答: 導致內存泄露主要的原因是,先前申請了內存空間而忘記了釋放。如果程序中存在無用對象的引用,那么這些對象就會駐留內存,消耗內存,因為無法讓垃圾回收器GC驗證這些對象是否不再需要。如果存在對象的引用,這個對象就被定義為“有效的活動”,同時不會被釋放。要確定對象所占內存將被回收,我們就要確認該對象不會再被使用。典型的做法是把對象數據成員設為null或者從集合中移除該對象。當出現以下情況時,會造成內存泄露:
1、 數據庫的cursor沒有關閉。
2、 構造adapter時,沒有使用緩存contentview。
3、 Bitmap對象不使用時,采用recycle()釋放內存。
4、 Activity中的對象的生命周期大于activity。
調試方法: DDMS==>HEAPSIZE==>dataobject==>[TotalSize]
- Android UI中的View如何刷新。
答: Android中對View的更新方式有很多種,使用時要區分不同的應用場合。要分清的是:多線程和雙緩沖。
1、不使用多線程和雙緩沖
這種情況最簡單,一般只希望View在發生改變時對UI進行重繪。你只需要Activity中顯式調用View對象中的invalidate()方法即可。系統會自動調用View的onDraw()方法。
2、使用多線程和不使用雙緩沖
這種情況下需要開啟新的線程,新開的線程就不好訪問View對象了。強行訪問的話會報錯:android.view.ViewRoot$ CalledFromWrongThreadException: only theoriginal thread that created a view hierarchy can touch its views。
這時候你需要創建一個繼承了android.os.handler的子類,并重寫handleMessage方法。Android.os.Handle是能發送和處理消息的,你需要在Activity中發出更新UI的消息,然后再你的Handler(可以使用匿名內部類)中處理消息(因為匿名內部類可以訪問父類變量,你可以直接調用View對象中的invalidate()方法。也就是說:在新線程中創建并發送一個Message,然后在主線程中捕獲、處理該消息。
3、使用多線程和雙緩沖
Android的SurfaceView是View的子類,她同時也實現了雙緩沖。你可以定義一個她的子類并實現Surfaceholder.Callback接口。由于SurfaceHolder.Callback接口,新線程就不要android.os.Handler幫忙了。SurfaceHolder中lockCanvas()方法可以鎖定畫布,繪制完新的圖像后調用unlockCanvasand Post解鎖。
(來自威哥干Java的微信文章)
七、過程
http://blog.csdn.net/wzhworld/article/details/78338196
WPS:(電話一面被刷,主要是結合項目問的)
1、什么是fragment,有什么好處(fragment設計的初衷是重用布局)
2、如何實現一個圓形的頭像加載器(項目中用到)
3、volley與okhttp區別在在哪,當使用頻繁加載小數據圖片應該用什么那個框架
4、http與https,什么是http,https有什么用(http://www.cnblogs.com/sunny-sl/p/6529830.html)
這一篇對于Okhttp的拆輪子寫得不錯https://blog.piasy.com/2016/07/11/Understand-OkHttp/
5、事件的分發、view的自定義(事件分發相關http://www.jianshu.com/p/7daf0feb6c2d、http://blog.csdn.net/carson_ho/article/details/54136311)
6、cookie、session(自己搭了服務器,所以問了這個)
7、listview加載圖片的時候,出現串擾(原因以及解決措施)
8、sharepreference可以跨進程嗎?
9、gson、json
10、數據庫
11、地圖沒打開定位權限可以打開嗎?
美圖:(視頻一面掛)
1、抽象類跟接口的區別
2、泛型的通配符(上下通配符)
3、sychronized的應用,鎖的類型,用于方法跟靜態方法的區別、死鎖的概念
4、內存泄漏有哪幾種情況、如何去看(用什么工具-LeakCanary)、
5、異步線程 HandlerThread 、AsyncTask、new Thread、IntentService
6、為什么要離開公司
7、職業規劃
8、有閱讀什么書籍、代碼
當時面完之后感覺自己還是差挺多的,所以就開始狂補知識,每天差不多就早上七點多到晚上十一點多這樣學
YY:(一面掛了)
1、x=5;y=x;x++;y=x+1;問了這些操作在內存中的具體情況是怎么樣,當時看了是一臉蒙蔽,都不知道問什么(個人覺得是想問你字節碼的情況是怎么樣)
2、java的TCP\IP的模型
其他的當時沒記,忘了,到這個時候個人覺得知識量已經差不多了,所以也開始沒怎么去記這些,基本問的都有看過
久邦:(面了兩輪)
一輪:
1、內存泄漏
2、設計模式(了解過什么設計模式)、
3、垃圾回收的內容(內存模型、垃圾回收)
4、事件分發
還有一些忘了,因為感覺到了這個時候問的基本都會,就一個狀態表現得好不好的問題,所以沒怎么記
二輪:
1、主要問項目的內容,然后拓展開
2、寫100個1
3、面試官給了張紙,然后說4棵樹任意兩兩之間距離都是相等的(因為給了張紙,把思維限制住了,當時有想到可以立體的,但是回頭一想要我會出來應該不怎么可能立體,然后自我否定了)
4、優缺點
迅雷:(一輪掛)
問了很多,都是常規的,如何開啟線程,現場寫出二叉后續遍歷的代碼,設計模式、tcp、http、java內存模型http://blog.csdn.net/wzhworld/article/details/78318867,基本答得出來,但是面試官全程看著我的簡歷,除了提問的時候抬起頭,其他時間都是低著頭,手機放在旁邊,時不時有人發微信過來,他也轉了3、4次頭去看,所以覺得沒什么戲,果然最后也沒過
4399:(一輪掛)
沒問什么技術的問題,問了我怎么關閉多個activity(網上有很多方法),說完之后他就開始問我怎么自學的,遇到困難怎么辦,我在回答一半的時候面試官直接打斷我跳到下一個問題,當時就知道沒戲了。
珠海虎牙:(二輪沒消息)
一輪:
面試官感覺是個剛才來的研究生,就剛好有我算法比賽有拿獎,就問了些算法的
1、數組有一個是只有一個這樣的數,其他的都是重復的,當時想了個比較暴力破解的辦法,然后面試官提供了一個解決的思路是去異或,異或有交換不變性,所以數組從第一個到最后一個進行異或之后會得出來那個沒有重復的數
2、數組,找出中位數
3、剩下的都是關于項目用到的內容,問到我有點措手不及,就有些內容自己都忘了,當時想不起來,當時自己沒去補充說可以怎么辦,所以面的感覺很不好
二輪:
一個像是組長的面試官,內容也是圍繞我項目去問,斷點續傳,socket的內容,可靠傳輸,面完之后感覺也一般般。
oppo:(拿到offer)
一輪:
問了挺多的,但是都是一些基礎的,跟項目相關的
1、okhttp跟volley,我說了兩個okhttp以及volley的實現過程(了解源碼),區別,談到責任鏈模式,當時面試官對于責任鏈很感興趣(所以面試的時候你要保證你說的每一句話你都得會,隨時面試官都會問你),我了解大概是怎么實現的,但具體沒有去寫過,然后面試官一直引導我,最后我想到了Handler的next消息出隊以及Loop的嵌套,然后提了一下,就一步步把這個過程最終寫出來(handler機制http://blog.csdn.net/wzhworld/article/details/78337641)
2、上面有提到Handler,面試官就問Handler具體的實現機制,一個環形的實現過程,回答的時候簡要說出要點,太羅嗦面試官反而不知道你要說什么
3、Activity啟動的四種模式,具體的應用到什么場景
4、后面都是些基本的,把https://github.com/francistao/LearningNotes/tree/master/Part1/Android這些知識點看懂應該基本都沒問題
二輪:
第二輪結合項目問,問的綜合一些,有點忘了,只記得一個是解決卡頓的問題,當時自己沒遇到過,然后面試官讓我說一下思路等,二面的話感覺看個人的綜合能力表較多
三輪:
是hr面試,到這一輪基本是一個人發展方向以及公司的狀況結合起來,表現好真實的自己基本沒問題,有個必須要注意的是,面試的時候不要隨便表現不滿,當時自己是二輪過了然后現場等待第三輪面試,從兩點半等到了五點半等了三個鐘,然后上去問安排人員的小姐姐的時候聽到還沒到我我發出了“嘖”的一聲,然后自己也覺得不太好,不能現場表現不滿。等待快到我面試的時候我看那個安排人員的小姐姐提著電腦進去做面試官了,面的就是我,當時我就蒙了,幸好最終還是過了。所以感覺每一個動作都有可能被面試官看在眼里。
總結:
自己的秋招差不多兩個月,基本狀態就是每天很疲憊,拖著身子去面試,晚上回來差不多就是那種倒在床上不想學習那種狀態,但是還是得挺著繼續,畢竟競爭這么大。自己拿到oppo的offer之后也算是有個著落了,挺開心的。
本文主要還是講一下大概的面試會遇到的問題,你們可以在網上搜,其實問來問去都是那些問題。不過因為半路出家的原因,可以看出我的求職路前面顯得有點艱辛,是通過刷面試,然后找到自己的不足,從最開始的筆試都過不了,到一輪過不了,到后面的hr面。講這些主要是為了給一樣在奮斗的小伙伴,給一樣是半路出家的小伙伴一個方向。同時在面試的時候要注意一個點就是自信,知識量夠了自信就來了,然后把每一次的面試當成一次聊天,跟面試官交流,聊得起來你就基本沒問題了。而且語言不要太羅嗦,點到即指,也可適度引導面試官的方向,引向你會的方向。
總結
以上是生活随笔為你收集整理的[转载] 【汇总】Android知识清单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言实现x的n次方
- 下一篇: C++识别二维码