1.介紹一下四大元件
Activity:代表手機上的一個界面,用于和使用者互動。
Service:可以在背景長期運作,沒有界面的元件。
ContentProvider:用于不同APP間存儲和交換資料。
BroadCastReceiver:廣播接收器,用于APP内部或APP間的資訊傳輸。
Fragment:和Activity一樣,擁有布局,生命周期,和使用者互動。但Fragment依賴于Activity,生命周期由Activity調用。
2.Activity啟動模式和用于場景
a:standard:預設啟動模式,每次啟動都會在棧頂建立一個新執行個體。
b:singleTop,棧頂模式,每次啟動時,判斷要啟動的Activity是否位于棧頂,如果位于棧頂,直接複用。如果不位于棧頂,則建立執行個體。複用時調用onNewIntent()方法。防止多次點選時建立多個,閱讀類 APP 的内容界面。
c:singleTask,棧内複用。判斷棧内是否已經有Activity執行個體,如果有,直接複用,并将該Activity上的執行個體全部出棧。隻調用一次onNewIntent()方法。常用于首頁和登陸頁。
d:singleInstance,單例模式。系統啟動新的棧來管理Activity,執行個體在系統隻有一個。
例如系統電話。
設定啟動模式:在清單檔案 AndroidManifest.xml 中配置 launchMode,當然可以用 Intent 标簽說事兒。通過設定 Intent.setFlags(int flags) 來設定啟動的 Activity 的啟動模式。
3.Activity生命周期
onCreate(),正在建立。做初始化工作。加載布局,資料初始化,綁定等
onStart(),正在啟動,Activity可見,但無法和使用者互動。
onResume(),Activity獲得焦點,在前台,可以與使用者互動。
onPause(),正在停止,系統準備去啟動或者回複另一個活動的時候調用,不可見
onStop(),即将停止,被下一個activity覆寫。做一些回收工作,例如網絡取消,若啟動的新活動是個對話框,onPause會執行,onStop不會執行.
onDestory(),即将銷毀,做回收和資源釋放。
onRestart(),Activity由背景切換到前台,由不可見到可見,Activity重新啟動。
4.fargment生命周期
onAttach()->onCreate()-> onCreateView()->onActivityCreated()->onStart()->onResume()->onPause()->onStop()->onDestroyView()->onDestroy()->onDetach()
與Activity不同的有:
onAttach():當Fragment和Activity建立關聯時調用
onCreateView():當Fragment建立視圖時調用
onActivityCreated():當與Fragment相關聯的Activity完成onCreate()之後調用
onDestroyView():在Fragment中的布局被移除時調用
onDetach():當Fragment和Activity解除關聯時調用
使用方法:
如果用replace()就會每次都初始化Fragment
正确的切換方式是add(),切換時hide(),add()另一個Fragment;再次切換時,隻需hide()目前,show()另一個。這樣就能做到多個Fragment切換不重新執行個體化
5.為什麼要用Fragment
子產品化(Modularity):我們不必把所有代碼全部寫在Activity中,而是把代碼寫在各自的Fragment中。
可重用(Reusability):多個Activity可以重用一個Fragment。
可适配(Adaptability):根據硬體的螢幕尺寸、螢幕方向,能夠友善地實作不同的布局,這樣使用者體驗更好。
使用場景:
非常經典的例子,即用兩個Fragment封裝兩個界面子產品,這樣隻使一套代碼就能适配兩種裝置,達到兩種界面效果;單一場景切換時使用Fragment更輕量化,如ViewPager和Fragment搭配使用。
6.service啟動模式
第一種,其他元件調用Context的 startService() 方法可以啟動一個Service,并回調服務中的onStartCommand()。如果該服務之前還沒建立,那麼回調的順序是onCreate()->onStartCommand()。服務啟動了之後會一直保持運作狀态,直到stopService() 或 stopSelf() 方法被調用,服務停止并回調onDestroy()。另外,無論調用多少次startService()方法,隻需調用一次stopService()或stopSelf()方法,服務就會停止了。
第二種,其它元件調用Context的 bindService() 可以綁定一個Service,并回調服務中的onBind()方法。類似地,如果該服務之前還沒建立,那麼回調的順序是onCreate()->onBind()。之後,調用方可以擷取到onBind()方法裡傳回的IBinder對象的執行個體,進而實作和服務進行通信。隻要調用方和服務之間的連接配接沒有斷開,服務就會一直保持運作狀态,直到調了unbindService() 方法服務會停止,回調順序onUnBind()->onDestroy()。多個元件可以綁定到一個Service,當它們都解綁時,Servive被銷毀。
7.IntentService
IntentService是Service的子類,IntentService在執行onCreate操作的時候,内部開了一個線程,去你執行你的耗時操作。通過Handler looper message的方式實作了一個多線程的操作,同時耗時操作也可以被這個線程管理和執行,同時不會産生ANR的情況。
比較:
Service不是獨立的程序,也不是獨立的線程,它是依賴于應用程式的主線程(比喻成沒有界面的activity),也就是說,在更多時候不建議在Service中編寫耗時的邏輯和操作,否則會引起ANR。
不同于線程,IntentService是服務,優先級比線程高,更不容易被系統殺死,是以較适合執行一些高優先級的背景任務;不同于普通Service,IntentService可自動建立子線程來執行任務,且任務執行完畢後自動退出。
8.Activity與Service通信
1.通過BroadCastReceiver:這種方式是最簡單的,隻能用來交換簡單的資料;
2.通過Messager:這種方式是通過一個傳遞一個Messager給對方,通過這個它來發送Message對象。這種方式隻能單向傳遞資料。可以是Service到Activity,也可以是從Activity發送資料給Service。一個Messeger不能同時雙向發送;
3.通過Binder來實作遠端調用(IPC):這種方式是Android的最大特色之一,讓你調用遠端Service的接口,就像調用本地對象一樣,實作非常靈活,寫起來也相對複雜。
binder流程如下:
1、在Service子類建立 binder子類,傳回目前服務的this對象。讓前端能夠通過 binder 類實作對 service 的調用。
2、service 中的 onbinder方法傳回 binder 執行個體。
3、在前端中的 onserviceconnected 中接收傳回的 binder 執行個體。通過binder 執行個體獲得服務的this對,通過對象調用公共方法,實作通信。
9.廣播種類
a:普通廣播:一種完全異步執行的廣播,在廣播發出之後,所有的廣播接收器幾乎都會在同一時刻接收到這條廣播消息,是以它們接收的先後是随機的。
b:有序廣播:一種同步執行的廣播,在廣播發出之後,同一時刻隻會有一個廣播接收器能夠收到這條廣播消息,當這個廣播接收器中的邏輯執行完畢後,廣播才會繼續傳遞,是以此時的廣播接收器是有先後順序的,且優先級(priority)高的廣播接收器會先收到廣播消息。有序廣播可以被接收器截斷使得後面的接收器無法收到它。 sendOrderedBroadcast(intent, null, null, null, “這是初始資料”, );
c:本地廣播:發出的廣播隻能夠在應用程式的内部進行傳遞,并且廣播接收器也隻能接收本應用程式發出的廣播。(Hander實作,高效)
d:粘性廣播:這種廣播會一直滞留,當有比對該廣播的接收器被注冊後,該接收器就會收到此條廣播。
e:無序廣播:所有的接收者都會接收事件,不可以被攔截,不可以被修改。sendBroadcast(intent);
10.廣播的注冊方式
靜态注冊:也可成為常駐型廣播,這種廣播需要在Androidmanifest.xml中進行注冊,這中方式注冊的廣播,不受頁面生命周期的影響,即使退出了頁面,也可以收到廣播這種廣播一般用于想開機自啟動啊等等,由于這種注冊的方式的廣播是常駐型廣播,是以會占用CPU的資源。
使用:生成一個類去繼承BroadcastReceiver,并複寫onReceiver()方法,并且在清單檔案中注冊Receiver,在标簽中定義action唯一辨別屬性。
動态注冊:而動态注冊的話,是在代碼中注冊的,這種注冊方式也叫非常駐型廣播,收到生命周期的影響,退出頁面後,就不會收到廣播,我們通常運用在更新UI方面。這種注冊方式優先級較高。最後需要解綁,否會會記憶體洩露。unregisterReceiver(dynamicReceiver);
使用:建立一個類繼承BroadcastReceiver,重寫onReceiver()方法.然後再Activity當中複寫onStart()和onStop()方法,在onStart()當中,我們需要構造一個IntentFilter對象,并執行這個對象的addAction方法,參數為action辨別符,再執行registerReceiver()方法,參數為廣播接收器對象和IntentFilter對象。在onStop()中執行unregisterReceiver()方法,參數為廣播接收器對象。
11.contentProvider
ContentProvider主要負責存儲和共享資料。實際上是對SQLiteOpenHelper的進一步封裝,以一個或多個表的形式将資料呈現給外部應用,通過Uri映射來選擇需要操作資料庫中的哪個表,并對表中的資料進行增删改查處理。ContentProvider其底層使用了Binder來完成APP程序之間的通信,同時使用匿名共享記憶體來作為共享資料的載體。ContentProvider支援通路權限管理機制,以控制資料的通路者及通路方式,保證資料通路的安全性。
使用步驟:
過程:
1、建立自己的資料清單;
2、自定義ContentProvider實作相關的抽象方法;
3、在AndroidManifest中聲明provider以及定義相關通路權限;
4 、通過ContentResolver根據URI進行增删改查。