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

快到金三銀四了,很多小夥伴還沒有復工,在家呆的有點慌,不知道之後會面臨的裁員還是被裁員。在這裏我給大家收集了很多面試題,刷完這些面試題,金三銀四絲毫不用慌了

AndroidBAT面試專題PDF+學習筆記+相對應的視頻教程(見末尾)
接近金三銀四?不要慌,先刷完這幾百道面試題

一丶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 被系統銷燬殺掉或是由於內存不足時調用

2)Service

a) onBind 方式綁定的:onCreate->onBind->onUnBind->onDestory(不管調用 bindService 幾次,onCreate 只會調用一次,onStart 不會被調用,建立連接後,service 會一直運行,直到調用
unBindService 或是之前調用的 bindService 的 Context 不存在了,系統會自動停止 Service,對
應的 onDestory 會被調用)

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

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

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

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方法向主線程發送消息請求遍歷,最終調用 ViewRootImplperformTraversals方法,這個方法會執行 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&lt;Key, WeakReference&lt;EngineResource&lt;?&gt;&gt;&gt; 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. 兩個不重複的數組集合中,這兩個集合都是海量數據,內存中放不下,怎麼求共同的元
    素?
  19. 一個文件中有 100 萬個整數,由空格分開,在程序中判斷用戶輸入的整數是否在此文件
    中。說出最優的方法
  20. 一張 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)

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