每一次去面試就是一次對自我知識的總結和審覈,如果你想拿到大廠的offer.成功的通過一面二面三面四面,那麼我分享的面試學習路線你可以來參考一下(PDF文檔版見如下)那麼面試中最常問的小知識點不懂的透徹怕是不行了
(順手留下GitHub鏈接,需要獲取相關面試等內容的可以自己去找)
https://github.com/xiangjiana/Android-MS
更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。
可以點擊關於我聯繫我獲取
1 、四大組件是什麼
1)Activity: 用戶可操作的可視化界面,爲用戶提供一個完成操作指令的窗口。一個 Activity通常是一個單獨的屏幕,Activity通過Intent來進行通信。Android中會維持一個Activity Stack,當一個新 Activity 創建時,它就會放到棧頂,這個 Activity 就處於運行狀態。
2)Service: 服務,運行在手機後臺,適合執行不需和用戶交互且還需長期運行的任務。
3)ContentProvider: 內容提供者,使一個應用程序的指定數據集提供給其他應用程序,其他應用可通過 ContentResolver
類從該內容提供者中獲取或存入數據。它提供了一種跨進程數據共享的方式,當數據被修改後,ContentResolver
接口的 notifyChange
函數通知那些註冊監控特定 URI
的 ContentObserver
對象。
如 果 ContentProvider
和 調 用 者 在 同 一 進 程 中 , ContentProvider
的 方 法(query/insert/update/delete 等)和調用者在同一線程中;如果ContentProvider
和調用者不在同一進程,ContentProvider
方法會運行在它自身進程的一個 Binder 線程中。
4)Broadcast Receiver: 廣播接收者,運用在應用程序間傳輸信息,可以使用廣播接收器來讓應用對一個外部事件做出響應。
2、四大組件的生命週期和簡單用法
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
來停止服務。必須unbindService
和 stopService(stopSelf)
同時都調用了纔會停止服務。
3)BroadcastReceiver
a) 動態註冊: 存活週期是在 Context.registerReceiver
和Context.unregisterReceiver
之間,BroadcastReceiver
每次收到廣播都是使用註冊傳入的對象處理的。
b) 靜態註冊: 進程在的情況下,receiver 會正常收到廣播,調用 onReceive
方法;生命週期只存活在 onReceive
函數中,此方法結束BroadcastReceiver
就銷燬了。onReceive()
只有十幾秒存活時間,在 onReceive()
內操作超過 10S,就會報 ANR
。
進程不存在的情況,廣播相應的進程會被拉活,Application.onCreate
會被調用,再調用onReceive
。
4)ContentProvider
應該和應用的生命週期一樣,它屬於系統應用,應用啓動時,它會跟着初始化,應用關閉或被殺,它會跟着結束。
3 、Activity之間的通信方式
1)通過 Intent 方式傳遞參數跳轉
2)通過廣播方式
3)通過接口回調方式
4)藉助類的靜態變量或全局變量
5)藉助 SharedPreference 或是外部存儲,如數據庫或本地文件
4 、Activity各種情況下的生命週期
1) 兩 個 Activity(A->B) 切 換 (B 正 常 的 Activity) 的 生 命 周 期 :
onPause(A)
->onCreate(B)
->onStart(B)
->onResume(B)
->oStop(A)
這時如果按回退鍵回退到 A onPause(B)
->onRestart(A)
->onStart(A)
->onResume(A)
->oStop(B)
如果在切換到 B 後調用了 A.finish(),則會走到 onDestory(A),這時點回退鍵會退出應用
2) 兩個 Activity(A->B)切換(B 透明主題的 Activity 或是 Dialog 風格的 Acivity)的生命週期:
onPause(A)
->onCreate(B)
->onStart(B)
->onResume(B)
這時如果回退到 A onPause(B)
->onResume(A)
->oStop(B)
->onDestory(B)
3) Activity(A) 啓 動 後 點 擊 Home 鍵 再 回 到 應 用 的 生 命 周 期 :
onPause(A)
->oStop(A)
->onRestart(A)
->onStart(A)
->onResume(A)
5 、橫豎屏切換的時候,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->
6 、Activity 與Fragment 之間生命週期比較Fragment 生 命 周 期 :
Fragment 生 命 周 期 :
onAttach
->onCreate
->onCreateView
->onActivityCreated
->onStart
->onResume
->onPause
->onStop
->onDestoryView
->onDestory
->onDetach
切 換 到 該 Fragment :
onAttach
->onCreate
->onCreateView
->onActivityCreated
->onStart
->onResume
按下 Power 鍵: onPause
->onSaveInstanceState
->onStop
點亮屏幕解鎖: onStart
->onRestoreInstanceState
->onResume
切換到其他 Fragment: onPause
->onStop
->onDestoryView
切回到該 Fragment: onCreateView
->onActivityCreated
->onStart
->onResume
退出應用: onPause
->onStop
->onDestoryView
->onDestory
->onDetach
7 、Activity 上有 Dialog 的時候按 Home 鍵時的生命週期
AlertDialog
並不會影響Activity的生命週期,按Home鍵後纔會使Activity走onPause
->onStop
,AlertDialog
只是一個組件,並不會使 Activity 進入後臺。
8 、兩個Activity之間跳轉時必然會執行的是哪幾個方法?
前一個 Activity 的 onPause
,後一個 Activity 的 onResume
9丶前臺切換到後臺,然後再回到前臺,Activity 生命週期回調方法 。 彈出 Dialog , 生命值週期回調方法。
1) 前 臺 切 換 到 後 臺 , 會 執 行 onPause
->onStop
再 回 到 前 臺 , 會 執 行onRestart
->onStart
->onResume
2) 彈出 Dialog,並不會影響 Activity 生命週期
10 、Activity 的四種啓動模式對比
1)standard:
標準啓動模式(默認),每啓動一次 Activity,都會創建一個實例,即使從 ActivityAstartActivity
ActivityA
,也會再次創建 A 的實例放於棧頂,當回退時,回到上一個 ActivityA
的實例。
2) singleTop:
棧頂複用模式,每次啓動 Activity,如果待啓動的 Activity 位於棧頂,則不會重新 創 建 Activity 的 實 例 , 即 不 會 走 onCreate
->onStart
, 會 直 接 進 入 Activity 的onPause
->onNewIntent
->onResume
方法
3) singleInstance:
單一實例模式,整個手機操作系統裏只有一個該 Activity 實例存在,沒有
其他 Actvity,後續請求均不會創建新的 Activity。若 task 中存在實例,執行實例的onNewIntent()
。
應用場景: 鬧鐘、瀏覽器、電話
4) singleTask:
棧內複用,啓動的 Activity 如果在指定的 taskAffinity
的 task 棧中存在相應的實例,則會把它上面的 Activity 都出棧,直到當前 Activity 實例位於棧頂,執行相應的onNewIntent()
方法。如果指定的 task 不存在,創建指定的taskAffinity
的 task,taskAffinity
的作用,進入指寫 taskAffinity
的 task,如果指定的 task 存在,將 task 移到前臺,如果指定的 task不存在,創建指定的 taskAffinity
的 task.
**應用場景:**應用的主頁面
11 、Activity 狀態保存於恢復
Activity 被主動回收時,如按下 Back 鍵,系統不會保存它的狀態,只有被動回收時,雖然這個 Activity 實例已被銷燬,但系統在新建一個 Activity 實例時,會帶上先前被回收 Activity 的信息。在當前 Activity 被銷燬前調用onSaveInstanceState
(onPause
和 onStop
之間保存),重新創建 Activity 後會在 onCreate
後調用onRestoreInstanceState
(onStart
和onResume
之間被調用),它們的參數 Bundle 用來數據保存和讀取的。
**保存 View 狀態有兩個前提:**View 的子類必須實現了 onSaveInstanceState
; 必須要設定 Id,這個 ID 作爲 Bundle 的 Key
12 、fragment 各種情況下的生命週期
正 常 情 況 下 的 生 命 周 期 :
onAttach
->onCreate
->onCreateView
->onActivityCreated
->onStart
->onResume
->onPause
->onStop
->onDestoryView
->onDestory
->onDetach
Fragment 在 Activity 中replace onPause(舊)
->onAttach
->onCreate
->onCreateView
->onActivityCreated
->onStart
->onResume
->onStop(舊)
->onDestoryView(舊)
如果添加到 backStack
中,調用 remove()方法 fragment 的方法會走到onDestoryView
,但不會執行 onDetach()
,即 fragment 本身的實例是存在的,成員變量也存在,但是 view 被銷燬了。如果新替換的 Fragment 已在 BackStack
中,則不會執行 onAttach
->onCreate
13 、Fragment 狀態保存 onSaveInstanceState 是哪個類的方法,在什麼情況下使用?
在對應的 FragmentActivity.onSaveInstanceState
方法會調用FragmentController.saveAllState
,其中會對 mActive
中各個 Fragment 的實例狀態和 View 狀態分別進行保存.當 Activity 在做狀態保存和恢復的時候, 在它其中的 fragment 自然也需要做狀態保存和恢復.
14 、Fragment.startActivityForResult 是和 FragmentActivity 的 的 startActivityForResult ?
如果希望在 Fragment 的onActivityResult
接收數據,就要調用Fragment.startActivityForResult
,而 不 是 Fragment.getActivity().startActivityForResult
。Fragment.startActivityForResult
->FragmentActivitymHost.HostCallbacks.onStartActivityFromFragment
->FragmentActivity.startActivityFromFragment
。 如 果 request=-1 則 直 接 調 用FragmentActivity.startActivityForResult
,它會重新計算 requestCode
,使其大於0xfffff。
15 、如何實現 Fragment 的滑動?
ViewPager+FragmentPagerAdapter+List
16 、fragment 之間傳遞數據的方式?
1) 在相應的 fragment 中編寫方法,在需要回調的 fragment 裏獲取對應的 Fragment 實例,調用相應的方法;
2) 採用接口回調的方式進行數據傳遞;
a) 在Fragment1中創建一個接口及接口對應的set方法; b) 在Fragment1中調用接口的方法;
c)在 Fragment2 中實現該接口;
3) 利用第三方開源框架 EventBus
17 、service 和 和 activity 怎麼進行數據交互?
1) 通過 bindService
啓動服務,可以在 ServiceConnection
的onServiceConnected
中獲取到Service 的實例,這樣就可以調用 service 的方法,如果 service 想調用 activity 的方法,可以在 service 中定義接口類及相應的 set 方法,在 activity 中實現相應的接口,這樣 service 就可以回調接口言法;
2) 通過廣播方式
18丶說說 ContentProvider 、ContentResolver 丶ContentObserver 之間的關係
ContentProvider
實現各個應用程序間數據共享,用來提供內容給別的應用操作。如聯繫人應用中就使用了 ContentProvider
,可以在自己應用中讀取和修改聯繫人信息,不過需要獲取相應的權限。它也只是一箇中間件,真正的數據源是文件或 SQLite
等。
ContentResolver
內 容 解 析 者 , 用 於 獲 取 內 容 提 供 者 提 供 的 數 據 , 通 過ContentResolver.notifyChange(uri)
發出消息
ContentObserver
內容監聽者,可以監聽數據的改變狀態,觀察特定 Uri 引起的數據庫變化,繼而做一些相應的處理,類似於數據庫中的觸發器,當 ContentObserver
所觀察的 Uri 發生變化時,便會觸發它。
19 、請描述一下廣播 BroadcastReceiver 的理解
BroadcastReceiver
是一種全局監聽器,用來實現系統中不同組件之間的通信。有時候也會用來作爲傳輸少量而且發送頻率低的數據,但是如果數據的發送頻率比較高或者數量比較大就不建議用廣播接收者來接收了,因爲這樣的效率很不好,因爲 BroadcastReceiver
接收數據的開銷還是比較大的。
20 、廣播的分類
1 )普通廣播: 完全異步的,可以在同一時刻(邏輯上)被所有接收者接收到,消息傳遞的效率比較高,並且無法中斷廣播的傳播。
2 ) 有序廣播: 發送有序廣播後,廣播接收者將按預先聲明的優先級依次接收 Broadcast。優先級高的優先接收到廣播,而在其 onReceiver()
執行過程中,廣播不會傳播到下一個接收者,此時當前的廣播接收者可以abortBroadcast()
來終止廣播繼續向下傳播,也可以將 intent 中的數據進行修改設置,然後將其傳播到下一個廣播接收者。sendOrderedBroadcast(intent,null);//
發送有序廣播
3 )粘性廣播: sendStickyBroadcast()
來發送該類型的廣播信息,這種的廣播的最大特點是,當粘性廣播發送後,最後的一個粘性廣播會滯留在操作系統中。如果在粘性廣播發送後的一段時間裏,如果有新的符合廣播的動態註冊的廣播接收者註冊,將會收到這個廣播消息,雖然這個廣播是在廣播接收者註冊之前發送的,另外一點,對於靜態註冊的廣播接收者來說,這個等同於普通廣播。
21丶廣播使用的方式和場景
1)App 全局監聽:
在 AndroidManifest
中靜態註冊的廣播接收器,一般我們在收到該消息後,
需要做一些相應的動作,而這些動作與當前 App 的組件,比如 Activity 或者 Service 的是否運行無關,比如我們在集成第三方 Push SDK 時,一般都會添加一個靜態註冊的BroadcastReceiver
來監聽 Push 消息,當有 Push 消息過來時,會在後臺做一些網絡請求或者發送通知等等。
2)組件局部監聽:
這種主要是在 Activity 或者 Service 中使用 registerReceiver()
動態註冊的廣
播接收器,因爲當我們收到一些特定的消息,比如網絡連接發生變化時,我們可能需要在當前 Activity 頁面給用戶一些 UI 上的提示,或者將 Service 中的網絡請求任務暫停。所以這種動態註冊的廣播接收器適合特定組件的特定消息處理。
22 、在 manifest 和代碼中如何註冊和使用 BroadcastReceiver?
1)mainfest 中註冊:
靜態註冊的廣播接收者就是一個常駐在系統中的全局監聽器,也就是說如果你應用中配置了一個靜態的 BroadcastReceiver,而且你安裝了應用而無論應用是否處於運行狀態,廣播接收者都是已經常駐在系統中了。
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<actionandroid:name="com.smilexie.test.intent.mybroadcastreceiver"/>
</intent-filter>
</receiver>
2) 動態註冊:
動態註冊的廣播接收者只有執行了registerReceiver
(receiver, filter)纔會開始監聽廣播消息,並對廣播消息作爲相應的處理。
IntentFilter fiter = newIntentFilter("com.smilexie.test.intent.mybroadcastreceiver");
MyBroadcastReceiver receiver = new MyBroadcastReceiver();
registerReceiver(receiver, filter);
//撤銷廣播接受者的動態註冊unregisterReceiver(receiver);
23 、本地廣播和全局廣播有什麼差別?
1) LocalBroadcastReceiver
僅在自己的應用內發送接收廣播,也就是隻有自己的應用能收到,數據更加安全。廣播只在這個程序裏,而且效率更高。只能動態註冊,在發送和註冊的時候採用 LocalBroadcastManager
的 sendBroadcast
方法和 registerReceiver
方法。
2)全局廣播: 發送的廣播事件可被其他應用程序獲取,也能響應其他應用程序發送的廣播事件(可以通過 exported–是否監聽其他應用程序發送的廣播 在清單文件中控制) 全局廣播既可以動態註冊,也可以靜態註冊。
24 、AlertDialog,popupWindow,Activity 區別
(1)Popupwindow
在顯示之前一定要設置寬高,Dialog 無此限制。
(2)Popupwindow
默認不會響應物理鍵盤的 back,除非顯示設置了 popup.setFocusable(true)
;而在點擊 back 的時候,Dialog 會消失。
(3)Popupwindow
不會給頁面其他的部分添加蒙層,而 Dialog 會。
(4) Popupwindow
沒 有 標 題 , Dialog 默 認 有 標 題 , 可 以 通 過
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
取消標題
(5)二者顯示的時候都要設置 Gravity。如果不設置,Dialog 默認是Gravity.CENTER。
(6) 二 者 都 有 默 認 的 背 景 , 都 可 以 通 過setBackgroundDrawable(newColorDrawable(android.R.color.transparent));
去掉。
(7)Popupwindow
彈出後,取得了用戶操作的響應處理權限,使得其他 UI 控件不被觸發。而 AlertDialog
彈出後,點擊背景,AlertDialog
會消失。
25 、Application 和 和 Activity 的 的 Context 對象的區別
1)Application Context
是伴隨應用生命週期;不可以 showDialog
, startActivity
, LayoutInflation
可以startService\BindService\sendBroadcast\registerBroadcast\load Resource values
2)Activity Context
指生命週期只與當前 Activity 有關,而 Activity Context
這些操作都可以,即凡是跟 UI 相關的,都得用 Activity 做爲 Context 來處理。
一個應用 Context 的數量=Activity 數量+Service 數量+1(Application 數量)
- Android 屬性動畫特性
- 如何導入外部數據庫?
- LinearLayout、RelativeLayout、FrameLayout 的特性及對比,並介紹使用場景。
- 談談對接口與回調的理解
- 回調的原理
- 寫一個回調 demo
- 介紹下 SurfView
- RecycleView 的使用
- 序列化的作用,以及 Android 兩種序列化的區別
- 差值器
- 實現 Interpolator 接口,設置值的變化趨勢,SDK 中包含了勻速插值器、加速插值器、減速
- 插值器、先加速再減速、彈
- 估值器
- 實現 TypeEvaluatior 接口
- Android 中數據存儲方式
(順手留下GitHub鏈接,需要獲取相關面試等內容的可以自己去找)
https://github.com/xiangjiana/Android-MS
更多完整項目下載。未完待續。源碼。圖文知識後續上傳github。
可以點擊關於我聯繫我獲取