天天看點

android:四大元件

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進行增删改查。