Android四大組件
- Activity、BroadcastReceiver、ContentProvider、Service
四大組件生命週期方法和簡單用法
-
Activity生命週期方法:
onCreate()、onStart()、onResume、onPause()、onStop()、onDestroy()、onRestart()Activity的生命週期:Activity生命週期
Activity的啓動流程:Activity的啓動流程 -
BroadcastReceiver生命週期方法:
onReceive()BroadcastReceiver簡單用法和工作過程:BroadcastReceiver 工作過程
-
ContentProvider方法:
onCreate()、getType()、query()、insert()、delete()、update()。onCreate()會在ContentProvider創建時調用。其它需要ContentResolver的對應方法觸發。
ContentProvider用法:ContentProvider使用
-
Service生命週期方法:
1、 startService 生命週期:
onCreate -> onStartCommand -> onDestroy
重複啓動會執行onStartCommand2、bindService 生命週期:
onCreate -> onBind -> onUnbind -> onDestroy
重複綁定不會走生命週期方法Service的啓動流程:Service啓動流程 , Android Service使用
Activity之間的通信方式
- Intent : 啓動Activity的時候通過Intent傳值,可以跨進程通信
- BroadcastReceiver : 通過廣播可以實現跨進程、實時、互相通信
- Service : 通過bindService 的方式可以實現跨進程、實時、相互通信。
缺點:比較複雜 - 通過Application的全局變量、File、數據庫、SharedPreference 可以實現Activity之間通信。缺點:不能實時通信。
- EventBus 之類:實時,不能跨進程
Activity 各種情況下的生命週期
- 正常生命週期大家都知道,這裏主要是異常情況、橫豎屏以及不同啓動模式下的生命週期:
參考:Activity生命週期,activity啓動模式
Activity與Fragment之間生命週期比較
-
首先要知道Fragment 11個生命週期方法:
onAttach、onCreate、onCreateView、onActivityCreated、onStart、onResume、 onPause、 onStop、onDestroyView、onDestroy、onDetach
-
在Activity中添加Fragment,Activity和Fragment完整生命週期如下:
Activity: onCreate
fragment: onAttach
fragment: onCreate
fragment: onCreateView
fragment: onActivityCreated
Activity: onStart
fragment: onStart
Activity: onResume
fragment: onResume
fragment: onPause
Activity: onPause
fragment: onStop
Activity: onStop
fragment: onDestroyView
fragment: onDestroy
fragment: onDetach
Activity: onDestroy
兩個Activity之間跳轉時必然會執行的是哪幾個方法?
- A 必然會執行:
onPause
, 因爲B如果是個透明主題的Activity,就不會執行onStop方法。 - B 必然會執行:
onStart、onResume
, 因爲如果B是SingleTask
啓動模式,並且已經在棧內存在,則不會再次創建。
前臺切換到後臺,然後再回到前臺,Activity生命週期回調方法。彈出Dialog,觸發回調方法。
- 前臺切換到後臺 : onPause、 onStop
- 回到前臺 :onRestart、onStart、onResume
- 彈出Dialog時觸發 :onWindowFocusChanged, 彈出hasFocus爲false,消失hasFocus爲true。
Activity的四種啓動模式對比
- Standard :默認啓動模式,每次啓動都會創建一個Activity實例
- SingleTop :棧頂複用模式,當要啓動的Activity位於棧頂時,則直接複用此Activity,不會創建新的Activity。並且觸發
onNewIntent
方法。此過程聲明週期方法:onPause、 onNewIntent、 onResume
- SingleTask : 棧內複用模式,當要啓動的Activity已經位於棧內,則不會重新創建,而是直接銷燬位於該Activity棧上面的其他實例,使該Activity位於棧頂。該Activity聲明週期爲:
onNewIntent、 onRestart、onStart、onResume
- SingleInstance : 單實例模式,加強的SingleTask模式,除了具有SingleTask特點,系統還會爲此模式的activity單獨創建一個任務棧,使該activity單獨位於一個任務棧中
參考:activity啓動模式
Activity狀態保存於恢復
Activity狀態恢復一般指橫豎屏切換時(或者當內存不足時,被回收的後臺Activity),Activity銷燬與重建時數據的保存與恢復。
- onSaveInstanceState : 在該方法中保存數據。在onStop之前調用
- onRestoreInstanceState : 在該方法中恢復保存的數據。onStart之後調用
當Activity在manifest中設置configChanges屬性時:android:configChanges="orientation"
,橫豎屏切換Activity不會銷燬重建,而是執行onConfigurationChanged
方法
Fragment之間傳遞數據的方式?
- 廣播
- 全局變量通過set、get方法傳遞
- 本地存儲
- EventBus之類
service和activity怎麼進行數據交互?
- 通過廣播 : 優點:支持跨進行
- 通過EventBus之類 : 缺點:不支持跨進程
- 通過AIDL : 跨進程方案
- bindService : 綁定時通過Intent傳值給Service,綁定成功後在
onServiceConnected
中獲得在onBind
方法中返回的IBinder
實例,通過該IBinder實例調用Service中的方法。 可參考:Android Service使用
談談你對ContentProvider的理解
ContentProvider是應用程序間共享數據的接口,通過ContentProvider可以實現不同應用程序間的數據共享。
說說ContentProvider、ContentResolver、ContentObserver 之間的關係
- ContentProvider : 內容提供者。內部類
Transport
是一個Binder
子類,並且實現IContentProvider
接口,負責接收ContentResolver請求,並調用ContentProvider增刪改查方法 - ContentResolver : 內容解析者。通過
authority
屬性,獲得對應IContentProvider
對象,調用IContentProvider增刪改查方法,通過Binder機制,在ContentProvider 內部類Transport中接收。 - ContentObserver : 內容觀察者。通過
getContentResolver().registerContentObserver(uri,notifyForDescendants,observer)
註冊觀察者,當uri中內容發生變化時,會觸發監聽。
廣播的分類
- 普通廣播 : sendBroadcast, 所有註冊的廣播都能收到
- 有序廣播 : sendOrderedBroadcast, 優先級高的先收到,並且有修改廣播內容和決定是否繼續下發給低優先級廣播的權利
廣播使用的方式和場景
- 靜態註冊 : 在XML文件中註冊。場景:需要時刻監聽廣播
- 動態註冊 : registerReceiver()。 場景:特定頁面監聽廣播
本地廣播和全局廣播有什麼差別?
- 註冊方式 : 本地廣播只能通過
LocalBroadcastManager
進行註冊、發送、解除註冊等。LocalBroadcastManager.getInstance(this).registerReceiver()
- 作用域 : 全局廣播可以是應用內和應用之間使用,本地廣播只能本應用內使用。
AlertDialog,PopupWindow,Activity區別
- 級別不同 : Activity 是四大組件之一,而AlertDialog、PopupWindow都是依附在DecorView上的,即依附在Activity上。
- 是否阻塞 : PopupWindow點擊陰影背景彈框不能消失,除非調用dismiss方法,AlertDialog可以消失
- 背景是否全屏 : PopupWindow 背景可以不是全屏顯示,AlertDialog背景全屏顯示
Application 和 Activity 的 Context 對象的區別
-
繼承關係:Activity -> ContextThemeWrapper -> ContextWrapper -> Context,
Application -> ContextWrapper -> Context, -
聲明週期長短 : Activity中的Context是當前頁面的Context,Application的Context是整個應用的Context
Android屬性動畫特性
- 可以對任意對象的屬性執行動畫操作
- 真正改變View的本身屬性(區別於補間動畫只改變View的顯示效果)
Android中數據存儲方式
- 使用SharedPreferences存儲數據。/data/data/Package Name/Shared_Pref
- 文件存儲數據
- SQLite數據庫存儲數據。 /data/data/Package Name/database
- 使用ContentProvider存儲數據
- 網絡存儲數據
介紹下SurfView
SurfaceView 是 Android 中一種比較特殊的視圖(View),它跟平時時候的 TextView、Button 最大的區別是它跟它的視圖容器並不是在同一個視圖層上,它的 UI 顯示也可以不在一個獨立的線程中完成,所以對 SurfaceView 的繪製並不會影響到主線程的運行。綜合這些特點,SurfaceView 一般用來實現動態的或者比較複雜的圖像還有動畫的顯示。
Fragment懶加載
Fragment懶加載就是Fragment可見(並且已經執行onCreateView加載佈局)後才進行數據加載。
可以通過setUserVisibleHint(boolean isVisibleToUser)
(ViewPage中)或者onHiddenChanged(boolean hidden)
(FragmentManager管理)方法來判斷是否可見,進行數據加載。
Fragment嵌套Fragment,通過getChildFragmentManager(),讓當前的Fragemnt去管理Fragment。