接近金三銀四?不要慌,先刷完這幾百道面試題

快到金三銀四了,不少小夥伴尚未復工,在家呆的有點慌,不知道以後會面臨的裁人仍是被裁人。在這裏我給你們收集了不少面試題,刷完這些面試題,金三銀四絲絕不用慌了

AndroidBAT面試專題PDF+學習筆記+相對應的視頻教程(見末尾)
java

一丶Android常問基礎面試點

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

1)Activity

onCreate()->onStart()->onResume()->onPause()->onStop()->onDestory()
onCreate():爲 Activity 設置佈局,此時界面還不可見;
onStart(): Activity 可見但還不能與用戶交互,不能得到焦點
onRestart(): 從新啓動 Activity 時被回調
onResume(): Activity 可見且可與用戶進行交互
onPause(): 當前 Activity 暫停,不可與用戶交互,但還可見。在新 Activity 啓動前被系統調用保存現有的 Activity 中的持久數據、中止動畫等。
onStop(): 當 Activity 被新的 Activity 覆蓋不可見時被系統調用
onDestory(): 當 Activity 被系統銷燬殺掉或是因爲內存不足時調用android

2)Service

a) onBind 方式綁定的:onCreate->onBind->onUnBind->onDestory(無論調用 bindService 幾回,onCreate 只會調用一次,onStart 不會被調用,創建鏈接後,service 會一直運行,直到調用
unBindService 或是以前調用的 bindService 的 Context 不存在了,系統會自動中止 Service,對
應的 onDestory 會被調用)git

b) startService 啓動的:onCreate->onStartCommand->onDestory(start 屢次,onCreate 只會被
調用一次,onStart會調用屢次,該service會在後臺運行,直至被調用stopService或是stopSelf)github

c) 又被啓動又被綁定的服務,無論如何調用 onCreate()只被調用一次,startService 調用多少
次,onStart 就會被調用多少次,而 unbindService 不會中止服務,必須調用 stopService 或是
stopSelf 來中止服務。必須 unbindServicestopService(stopSelf)同時都調用了纔會中止服
務。面試

3)BroadcastReceiver

a) 動態註冊: 存活週期是在 Context.registerReceiverContext.unregisterReceiver 之間,
BroadcastReceiver 每次收到廣播都是使用註冊傳入的對象處理的。
b) 靜態註冊: 進程在的狀況下,receiver 會正常收到廣播,調用 onReceive 方法;生命週期
只存活在 onReceive 函數中,此方法結束,BroadcastReceiver 就銷燬了。onReceive()只有十
幾秒存活時間,在 onReceive()內操做超過 10S,就會報 ANR。進程不存在的狀況,廣播相應的進程會被拉活,Application.onCreate 會被調用,再調用onReceive算法

4)ContentProvider

應該和應用的生命週期同樣,它屬於系統應用,應用啓動時,它會跟着初始化,應用關閉或被殺,它會跟着結束。sql

2 .Activity 之間的通訊方式

1)經過 Intent 方式傳遞參數跳轉
2)經過廣播方式
3)經過接口回調方式
4)藉助類的靜態變量或全局變量
5)藉助 SharedPreference 或是外部存儲,如數據庫或本地文件

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

1 ) 切 換 橫 屏 時 :
onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume
2) 切換豎屏時:會打印兩次相同的 log
onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume->onSaveInstanceState->onPause->onStop->onDestory->onCreate->onStart->onRestoreInstanceState->onResume數據庫

**3) 如 果 在 AndroidMainfest.xml 中 修 改 該 Activity 的 屬 性 , 添 加
android:configChanges="orientation"橫豎屏切換,打印的 log 同樣,同 1)**
4) 如 果 AndroidMainfest.xml 中 該 Activity 中 的
android:configChanges="orientation|keyboardHidden",則只會打印
onConfigurationChanged編程

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

AlertDialog並不會影響Activity的生命週期,按Home鍵後纔會使Activity走onPause->onStop
AlertDialog 只是一個組件,並不會使 Activity 進入後臺設計模式

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

前一個 Activity 的 onPause,後一個 Activity 的 onResume

6.Fragment 狀態保存 onSaveInstanceState 是哪一個類的方法,在什麼狀況下使用?

在對應的 FragmentActivity.onSaveInstanceState 方法會調用 FragmentController.saveAllState
其中會對 mActive 中各個 Fragment 的實例狀態和 View 狀態分別進行保存.當 Activity 在作狀
態保存和恢復的時候, 在它其中的 fragment 天然也須要作狀態保存和恢復.

7.如何實現 Fragment 的滑動?

ViewPager+FragmentPagerAdapter+List<Fragment>

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

1)在相應的 fragment 中編寫方法,在須要回調的 fragment 裏獲取對應的 Fragment 實例,調
用相應的方法;
2)採用接口回調的方式進行數據傳遞;

a) 在 Fragment1中建立一個接口及接口對應的set方法;
b) 在 Fragment1中調用接口的方法;
c)在 Fragment2 中實現該接口;

3)利用第三方開源框架 EventBus

9.說說 ContentProviderContentResolverContentObserver 之間的關係

ContentProvider 實現各個應用程序間數據共享,用來提供內容給別的應用操做。如聯繫人應
用中就使用了 ContentProvider,能夠在本身應用中讀取和修改聯繫人信息,不過須要獲取相
應的權限。它也只是一箇中間件,真正的數據源是文件或 SQLite 等。

ContentResolver 內 容 解 析 者 , 用 於 獲 取 內 容 提 供 者 提 供 的 數 據 , 通 過
ContentResolver.notifyChange(uri)發出消息

ContentObserver 內容監聽者,能夠監聽數據的改變狀態,觀察特定 Uri 引發的數據庫變化,
繼而作一些相應的處理,相似於數據庫中的觸發器,當 ContentObserver 所觀察的 Uri 發生
變化時,便會觸發它。

10. 在 manifest 和代碼中如何註冊和使用 BroadcastReceiver?

1)mainfest 中註冊:靜態註冊的廣播接收者就是一個常駐在系統中的全局監聽器,也就是說
若是你應用中配置了一個靜態的 BroadcastReceiver,並且你安裝了應用而不管應用是否處於
運行狀態,廣播接收者都是已常常駐在系統中了。

<receiver android:name=".MyBroadcastReceiver">
      <intent-filter>
           <action android:name="com.smilexie.test.intent.mybroadcastreceiver"/>
      </intent-filter>
  </receiver>

2 ) 動態註冊:動態註冊的廣播接收者只有執行了 registerReceiver(receiver, filter)纔會開始監聽
廣播消息,並對廣播消息做爲相應的處理。

IntentFilter fiter = new IntentFilter("com.smilexie.test.intent.mybroadcastreceiver");
  MyBroadcastReceiver receiver = new MyBroadcastReceiver();
  registerReceiver(receiver, filter);

  //撤銷廣播接受者的動態註冊
  unregisterReceiver(receiver);
  • 11.Android 屬性動畫特性
  • 12.如何導入外部數據庫?
  • 13.LinearLayout、RelativeLayout、FrameLayout 的特性及對比,並介紹使用場景。
  • 14.談談對接口與回調的理解
  • 15.寫一個回調 demo
  • 16.介紹下 SurfView
  • 17.RecycleView 的使用
  • 18.序列化的做用,以及 Android 兩種序列化的區別

二丶Android View總結

19.View 的滑動方式

a.layout(left,top,right,bottom): 經過修改 View 四個方向的屬性值來修改 View 的座標,從而滑動 View
b.offsetLeftAndRight() offsetTopAndBottom(): 指定偏移量滑動 view
c.LayoutParams,改變佈局參數: layoutParams 中保存了 view 的佈局參數,能夠通
過修改佈局參數的方式滑動 view
d.經過動畫來移動 view: 注意安卓的平移動畫不能改變 view 的位置參數,屬性
動畫能夠
e.scrollTo/scrollBy: 注意移動的是 view 的內容,scrollBy(50,50)你會看到屏幕上的
內容向屏幕的左上角移動了,這是參考對象不一樣致使的,你能夠看做是它移動的
是手機屏幕,手機屏幕向右下角移動,那麼屏幕上的內容就像左上角移動了
f.scroller :scroller 須要配置 computeScroll 方法實現 view 的滑動,scroller 自己並不
會滑動 view,它的做用能夠看做一個插值器,它會計算當前時間點 view 應該滑
動到的距離,而後 view 不斷的重繪,不斷的調用 computeScroll 方法,這個方法
是個空方法,因此咱們重寫這個方法,在這個方法中不斷的從 scroller 中獲取當
前 view 的位置,調用 scrollTo 方法實現滑動的效果

20.View 的事件分發機制

點擊事件產生後,首先傳遞給 Activity 的 dispatchTouchEvent 方法,經過PhoneWindow 傳遞給 DecorView,而後再傳遞給根 ViewGroup,進入 ViewGroupdispatchTouchEvent 方法,執行 onInterceptTouchEvent 方法判斷是否攔截,再不攔截的狀況下,此時會遍歷 ViewGroup 的子元素,進入子 View 的dispatchToucnEvent 方法,若是子 view 設置了 onTouchListener,就執行onTouch方法,並根據 onTouch 的返回值爲 true 仍是 false 來決定是否執行 onTouchEvent方法,若是是 false 則繼續執行 onTouchEvent,在 onTouchEvent 的 Action Up 事件中判斷,若是設置了 onClickListener ,就執行 onClick 方法。

21.View 的加載流程

View 隨着 Activity 的建立而加載,startActivity 啓動一個 Activity 時,在ActivityThreadhandleLaunchActivity 方法中會執行 Activity 的 onCreate 方法,這個時候會調用 setContentView 加載佈局建立出 DecorView 並將咱們的 layout加載到 DecorView 中,當執行到 handleResumeActivity 時,Activity 的 onResume方法被調用,而後 WindowManager 會將 DecorView 設置給 ViewRootImpl,這樣,DecorView就被加載到Window中了,此時界面尚未顯示出來,還須要通過 View的 measure,layout 和 draw 方法,才能完成 View 的工做流程。咱們須要知道 View的繪製是由ViewRoot來負責的,每個DecorView都有一個與之關聯的ViewRoot,這種關聯關係是由WindowManager 維護的,將DecorViewViewRoot 關聯以後,ViewRootImpl的requestLayout會被調用以完成初步佈局,經過scheduleTraversals方法向主線程發送消息請求遍歷,最終調用 ViewRootImpl performTraversals方法,這個方法會執行 View 的 measure layout 和 draw 流程

三丶技術性面試問題

22)圖片庫對比
23)LRUCache 原理
LruCache 是個泛型類,主要原理是:把最近使用的對象用強引用存儲在 LinkedHashMap 中,
當緩存滿時,把最近最少使用的對象從內存中移除,並提供 get/put 方法完成緩存的獲取和
添加。LruCache 是線程安全的,由於使用了 synchronized 關鍵字。當調用 put()方法,將元素加到鏈表頭,若是鏈表中沒有該元素,大小不變,若是沒有,需調用 trimToSize 方法判斷是否超過最大緩存量,trimToSize()方法中有一個 while(true)死循環,若是緩存大小大於最大的緩存值,會不斷刪除 LinkedHashMap 中隊尾的元素,即最少訪問的,直到緩存大小小於最大緩存值。當調用 LruCache 的 get 方法時,LinkedHashMap 會調用recordAccess 方法將此元素加到鏈表頭部。
24 )圖片加載原理
25)本身去實現圖片庫,怎麼作?
26) Glide 源碼解析
27) Glide 使用什麼緩存?
1) 內存緩存: LruResourceCache(memory)+弱引用 activeResources
Map<Key, WeakReference<EngineResource<?>>> activeResources 正在使用的資源,當 acquired變量大於 0,說明圖片正在使用,放到 activeResources 弱引用緩存中,通過 release()後,acquired=0,說明圖片再也不使用,會把它放進 LruResourceCache
2)磁盤緩存: DiskLruCache,這裏分爲 Source(原始圖片)和 Result(轉換後的圖片)
第一次獲取圖片,確定網絡取,而後存 active\disk 中,再把圖片顯示出來,第二次讀取相同
的圖片,並加載到相同大小的 imageview 中,會先從 memory 中取,沒有再去 active 中獲取。
若是 activity 執行到 onStop 時,圖片被回收,active 中的資源會被保存到 memory 中,active
中的資源被回收。當再次加載圖片時,會從 memory 中取,再放入 active 中,並將 memory
中對應的資源回收。

之因此須要 activeResources,它是一個隨時可能被回收的資源,memory 的強引用頻繁讀寫
可能形成內存激增頻繁 GC,而形成內存抖動。資源在使用過程當中保存在 activeResources 中,
activeResources 是弱引用,隨時被系統回收,不會形成內存過多使用和泄漏。

28 )Glide 內存緩存如何控制大小?
Glide 內存緩存最大空間(maxSize)=每一個進程可用最大內存*0.4(低配手機是 每一個進程可用
最大內存*0.33)
磁盤緩存大小是 250MB int DEFAULT_DISK_CACHE_SIZE = 250 1024 1024;

29.網絡框架對比和源碼分析
30.本身去設計網絡請求框架,怎麼作?
31.okhttp 源碼
32.網絡請求緩存處理,okhttp 如何處理網絡緩存的;

四丶數據庫面試內容

33.sqlite 升級,增長字段的語句
34.數據庫框架對比和源碼分析
35.數據庫的優化
36.數據庫數據遷移問題

五丶算法

  1. 排序算法有哪些?
  2. 最快的排序算法是哪一個?
  3. 手寫一個冒泡排序
  4. 手寫快速排序代碼
  5. 快速排序的過程、時間複雜度、空間複雜度
  6. 手寫堆排序
  7. 堆排序過程、時間複雜度及空間複雜度
  8. 寫出你所知道的排序算法及時空複雜度,穩定性
  9. 二叉樹給出根節點和目標節點,找出從根節點到目標節點的路徑
  10. 給阿里 2 萬多名員工按年齡排序應該選擇哪一個算法?
  11. GC 算法( 各類算法的優缺點以及應用場景)
  12. 蟻羣算法與蒙特卡洛算法
  13. 子串包含問題(KMP 算法) 寫代碼實現
  14. 一個無序, , 不重複數組, , 輸出 N 個元素, , 使得 N 個元素的和相加爲 M, , 給出時間複雜度、 、.空間複雜度。手寫算法
  15. 萬億級別的兩個 URL 文件 A 和 和 B, , 如何求出 A 和 和 B 的差集 C( 提示 :Bit 映射->hash 分組->多文件讀寫效率-> 磁盤尋址以及應用層面對尋址的優化)
  16. 百度 POI 中如何試下查找最近的商家功能( 提示:座標鏡像+R 樹) 。
  17. 兩個不重複的數組集合中,求共同的元素。
  18. 兩個不重複的數組集合中,這兩個集合都是海量數據,內存中放不下,怎麼求共同的元

素?

  1. 一個文件中有 100 萬個整數,由空格分開,在程序中判斷用戶輸入的整數是否在此文件

中。說出最優的方法

  1. 一張 Bitmap 所佔內存以及內存佔用的計算

六丶插件化、模塊化、組件化、熱修復、增量更新、Gradle

  1. 對熱修復和插件化的理解
  2. 插件化原理分析
  3. 模塊化實現(好處,緣由)
  4. 熱修復, 插件化
  5. 項目組件化的理解
  6. 擊 描述清點擊 Android Studio 的 build 按鈕後發生了什麼

七丶架構設計和設計模式

  1. 談談你對 Android 設計模式的理解
  2. MVC MVP MVVM 原理和區別
  3. 你所知道的設計模式有哪些?
  4. 項目中經常使用的設計模式
  5. 手寫生產者/ 消費者模式
  6. 寫出觀察者模式的代碼
  7. 適配器模式,裝飾者模式,外觀模式的異同?
  8. 用到的一些開源框架,介紹一個看過源碼的,內部實現過程。

71. 談談對 RxJava的理解
RxJava 是基於響應式編程,基於事件流、實現異步操(相似於 Android 中的 AsyncTaskHandler
做用)做的庫,基於事件流的鏈式調用,使得 RxJava 邏輯簡潔、使用簡單。RxJava 原理是
基於一種擴展的觀察者模式,

有四種角色: 被觀察者 Observable 觀察者 Observer 訂閱subscribe 事件 Event。

RxJava 原理可總結爲: 被觀察者 Observable 經過訂閱(subscribe)按順序發送事件(Emitter)給觀察者(Observer), 觀察者按順序接收事件&做出相應的響應動做

RxJava 中的操做符:
1)defer(): 直到有觀察者(Observer)訂閱時,纔會動態建立被觀察者對象(Observer)&發送事件,經過 Observer 工廠方法建立被觀察者對象,每次訂閱後,都會獲得一個剛建立的最新的
Observer 對象,能夠確保 Observer 對象裏的數據是最新的。defer()方法只會定義 Observable對象,只有訂閱操做纔會建立對象。

Observable<T> observable = Observable.defer(new Callable<ObservableSource<? extends T>>() {
      @Override
      public ObservableSource<? extends T> call() throws Exception {
         return Observable.just();
      }
  }

2)timer() 快速建立一個被觀察者(Observable),延遲指定時間後,再發送事件

Observable.timer(2, TimeUnit.SECONDS)// 也能夠自定義線程 timer(long, TimeUnit, Scheduler)
      .subscribe(new Observer<Long>() {
          @Override
          public void onSubscribe(Disposable d) {
          }
          ...
  });

3) interval() intervalRange() 快速建立一個被觀察者對象(Observable),每隔指定時間就發送
事件

//interval 三個參數,參數 1 :第一次延遲時間 參數 2 :間隔時間數字 參數 3 :時間單位
  Observable.interval(3, 1, TimeUnit.SECONDS).subscribe();
  //intervalRange 五個參數,參數 1 :事件序列起始點 參數 2 :事件數量 參數 3 :第一次延遲時間 參數 4 :間隔時間數字 參數 5 :時間單位
  Observable.intervalRange(3, 10, 2, 1, TimeUnit.SECONDS).subscribe();
72.Rxjava 發送事件步驟

1)建立被觀察者對象 Observable&定義須要發送的事件

Observable.create(new ObservableOnSubscribe<T>(){
      @Override
      public void subscribe(ObservableEmitter<T> emitter) throws Exception {
        // 定義發送事件的行爲
      }
  });

Observable.create()方法實際建立了一個 ObservableCreate 對象,它是 Observable 的子類,傳
入一個 ObservableOnSubscribe 對象,複寫了發送事件行爲的 subscribe()方法。
2)建立觀察者對象 Observer&定義響應事件的行爲

Observer observer = new Observer<T>() {

     @Override
     public void onSubscribe(Disposable d){//Disposable 對象可用於結束事件
       // 默認最早調用
     }

     @Override
     public void onNext(T t){
     }

     @Override
      public void onError(Throwable d){
     }
     
     @Override
      public void onComplete(){
     }
  }

3)經過 subscribe()方法使觀察者訂閱被觀察者

Observable.subscribe(Observer observer);// 實際調用的是 ObservableCreate.subscribeActual() 方法,具體實現以下

  protected void subscribeActual(Observer<? super T> observer) {
        // 1. 建立 1 個 CreateEmitter 對象用於發射事件(封裝成 1 個 Disposable 對
象)
        CreateEmitter<T> parent = new CreateEmitter<T>(observer);
       // 2. 調用觀察者( Observer )的 onSubscribe ()
      observer.onSubscribe(parent);
      try {
          // 3. 調用 source 對象的( ObservableOnSubscribe 對象) subscribe ()
          source.subscribe(parent);
      } catch (Throwable ex) {
          Exceptions.throwIfFatal(ex);
          parent.onError(ex);
      }
  }
  1. RxJava 的做用,與平時使用的異步操做來比的優缺點
  2. 說說 EventBus 做用,實現方式,代替 EventBus 的方式
  3. 從 從 0 設計一款 App 總體架構,如何去作?
  4. 說一款你認爲當前比較火的應用並設計( 好比:直播 APP ,P2P 金融,小視頻等)
  5. 談談對 java 狀態機理解
  6. Fragment 若是在 Adapter 中使用應該如何解耦?
  7. Binder 機制及底層實現
  8. 對於應用更新這塊是如何作的?( 解答:灰度,強制更新,分區域更新) ?
  9. 實現一個 Json 解析器

八丶性能優化

  1. 如何對 Android 應用進行性能分析以及優化?
  2. ddms 和 和 traceView
  3. 性能優化如何分析 systrace ?
  4. 用 用 IDE 如何分析內存泄漏?
  5. Java 多線程引起的性能問題,怎麼解決?
  6. 啓動頁白屏及黑屏解決?
  7. 啓動太慢怎麼解決?
  8. 怎麼保證應用啓動不卡頓?
  9. App 啓動崩潰異常捕捉
  10. 自定義 View 注意事項
  11. 如今下載速度很慢, 試從網絡協議的角度分析緣由, 並優化( 提示: : 網絡的 的 5 層均可以涉及)。
  12. Https 請求慢的解決辦法(提示:DNS ,攜帶數據,直接訪問 IP )
  13. 如何保持應用的穩定性
  14. RecyclerView 和 和 ListView 的性能對比
  15. ListView 的優化
  16. RecycleView 優化
  17. View 渲染
  18. Bitmap 如何處理大圖,如一張 30M 的大圖,如何預防 OOM
  19. java 中的四種引用的區別以及使用場景
  20. 強引用置爲 null ,會不會被回收?
更多信息能夠點擊關於我 , 很是但願和你們一塊兒交流 , 共同進步
順手留下GitHub連接,須要獲取相關面試等內容的能夠本身去找
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)
相關文章
相關標籤/搜索