1. 程式人生 > >Android 安卓 四大元件

Android 安卓 四大元件

Android開發的四大元件 
Android四大元件分別為activity、service、content provider、broadcast receive 
一、Activity 
 
Activity生命週期的方法是成對出現的

onCreate() & onDestory() 
onStart() & onStop() 
onResume() & onPause()

每一個活動( Activity)都處於某一個狀態,對於開發者來說,是無法控制其應用程式處於某一個狀態的,這些均由系統來完成。 但是當一個活動的狀態發生改變的時候,開發者可以通過呼叫onXX() 的方法獲取到相關的通知資訊。 在實現 Activity 類的時候,通過覆蓋( override )這些方法即可在你需要處理的時候來呼叫。 
一,onCreate:當活動第一次啟動的時候,觸發該方法,可以在此時完成活動的初始化工作。onCreate方法有一個引數,該引數可以為空(null),也可以是之前呼叫onSaveInstanceState方法儲存的狀態資訊。 二,在onStart:方法該觸發的所屬表示將活動被展現給使用者四,在onPause:當一個正在前臺執行的活動因為其他的活動需要前臺執行而轉入後臺執行的時候,觸發該方法。這時候需要將活動的狀態持久化,比如正在編輯的資料庫記錄等。 五,onStop:當一個活動不再需要展示給使用者的時候,觸發該方法。如果記憶體緊張,系統會直接結束這個活動,而不會觸發onStop方法。所以儲存狀態資訊是應該在onPause時做,而不是onStop時做。活動如果沒有在前臺執行,都將被停止或者Linux管理程序為了給新的活動預留足夠的儲存空間而隨時結束這些活動。因此對於開 者來說,在設計應用程式的時候,必須時刻牢記這一原則。在一些情況下,在onPause方法或許是活動觸發的最後的方法,因此開發者需要在這個時候儲存需要儲存的資訊。六,onRestart :當處於停止狀態的活動需要再次展現給使用者的時候,觸發該方法。七,onDestroy:當活動銷燬的時候,觸發該方法。和onStop方法一樣,如果記憶體緊張,系統會直接結束這個活動而不會觸發該方法·。 的onSaveInstanceState:系統呼叫該方法,允許活動儲存之前的狀態,比如說在一串字串中的游標所處的位置等活動棧

每個Activity的狀態是由它在Activity棧(是一個後進先出LIFO,包含所有正在執行Activity的佇列)中的位置決定的。 
當一個新的Activity啟動時,當前的活動的Activity將會移到Activity棧的頂部。 
 
一個應用程式的優先順序是受最高優先順序的Activity影響的。當決定某個應用程式是否要終結去釋放資源,Android記憶體管理使用棧來決定基於Activity的應用程式的優先順序。 
Activity狀態 
Activity有以下四種狀態: 
活動的:當一個Activity在棧頂,它是可視的、有焦點、可接受使用者輸入的。Android試圖盡最大可能保持它活動狀態,殺死其它Activity來確保當前活動Activity有足夠的資源可使用。當另外一個Activity被啟用,這個將會被暫停。 
暫停:在很多情況下,你的Activity可視但是它沒有焦點,換句話說它被暫停了。有可能原因是一個透明或者非全屏的Activity被啟用。 
當被暫停,一個活動仍會當成活動狀態,只不過是不可以接受使用者輸入。在極特殊的情況下,機器人將會殺死一個暫停的活動來為活動的活動提供充足的資源。當一個活動變為完全隱藏,它將會變成停止。停止:。當一個活動不是可視的,它“停止”了這個活動將仍然在記憶體中儲存它所有的狀態和會員資訊儘管如此,當其它地方需要記憶體時,它將是最有可能被釋放資源的。當一個活動停止後,一個很重要的步驟是要儲存資料和當前UI狀態。一旦一個活動退出或關閉了,它將變為待用狀態。待用:。在一個活動被殺死後和被裝在前,它是待用狀態的待用胡亞蓉被移除活動棧,並且需要在顯示和可用之前重新啟動它的活性的四種載入模式在機器人的多活性開發中,活動之間的跳轉可能需要有多種方式,有時是普通的生成一個新例項 有時希望跳轉到原來某個活動例項,而不是生成大量的重複的活性。載入模式便是決定以哪種方式啟動一個跳轉到原來某個活動例項。在機器人裡,有4種活性的啟動模式,分別為:·standard:標準模式,一呼叫startActivity()方法就會產生一個新的例項。·singleTop:如果已經有一個例項位於Activity stack的頂部時,就不產生新的例項,而只是呼叫Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的例項。·singleTask:會在一個新的任務中產生這個例項,以後每次呼叫都會使用這個,不會去產生新的例項了。

·singleInstance:這個跟singleTask基本上是一樣,只有一個區別:在這個模式下的Activity例項所處的task中,只能有這個activity例項,不能有其他的例項。 
這些啟動模式可以在功能清單檔案AndroidManifest.xml中進行設定,中的launchMode屬性。 
相關的程式碼中也有一些標誌可以使用,比如我們想只啟用一個例項,則可以使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 
標誌,這個標誌表示:如果這個activity已經啟動了,就不產生新的activity,而只是把這個activity例項加到棧頂來就可以了。1、Intent intent = new Intent(ReorderFour.this, ReorderTwo.class); 
2、intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
3、startActivity(intent); 
複製程式碼 
Activity的載入模式受啟動Activity的Intent物件中設定的Flag和manifest檔案中Activity的元素的特性值互動控制。

FLAG_ACTIVITY_NEW_TASK 
FLAG_ACTIVITY_CLEAR_TOP 
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 
FLAG_ACTIVITY_SINGLE_TOP

核心的特性有:

taskAffinity 
launchMode 
clearTaskOnLaunch 
alwaysRetainTaskState 
finishOnTaskLaunch

四種載入模式的區別 所屬task的區別 
一般情況下,“standard”和”singleTop”的activity的目標task,和收到的Intent的傳送者在同一個task內,就相當於誰呼叫它,它就跟誰在同一個Task中。 
除非Intent包括引數FLAG_ACTIVITY_NEW_任務。如果提供了FLAG 活動新_ TASK引數,會啟動到別的任務裡。“singleTask”和” singleInstance”總是把要啟動的活動作為一個任務的根元素,他們不會被啟動到一個其他任務裡。是否允許多個例項“standard”和“singleTop”可以被例項化多次,並且是可以存在於不同的任務中;這種例項化時一個任務可以包括一個activity的多個例項; “ singleTask“和”singleInstance“則限制只生成一個例項,並且是task的根元素。singleTop要求如果建立intent的時候棧頂已經有要建立的Activity的例項,則將intent傳送給該例項,而不建立新的例項。是否允許其它活動存在於本任務內“singleInstance”獨佔一個任務,其它活動不能存在那個任務裡; 如果它啟動了一個新的活動,不管新的活動的啟動模式如何,新的活動都將會到別的任務裡執行(如同加了FLAG 活動 NEW_TASK引數)。而另 三種模式,則可以和其它活動共存。是否每次都生成新例項

“standard”對於每一個啟動Intent都會生成一個activity的新例項; 
“singleTop”的activity如果在task的棧頂的話,則不生成新的該activity的例項,直接使用棧頂的例項,否則,生成該activity的例項。 
“singleInstance”是其所在棧的唯一activity,它會每次都被重用。 
“singleTask” 如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前臺。 
當已經存在的activity例項處理新的intent時候,會呼叫onNewIntent()方法,如果收到intent生成一個activity例項,那麼使用者可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,使用者不能通過按back鍵返回到這之前的狀態。 
———————————– 
二、Service 
service可以在和多場合的應用中使用,比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後臺繼續播放,比如檢測SD卡上檔案的變化,再或者在後臺記錄你地理資訊位置的改變等等,總之服務嘛,總是藏在後頭的。 
Service是在一段不定的時間執行在後臺,不和使用者互動應用元件。每個Service必須在manifest中 
通過來宣告。可以通過contect.startservice和contect.bindserverice來啟動。 
Service和其他的應用元件一樣,執行在程序的主執行緒中。這就是說如果service需要很多耗時或者阻塞的操作,需要在其子執行緒中實現。

啟動service,根據onStartCommand的返回值不同,有兩個附加的模式: 
1、START_STICKY 用於顯示啟動和停止service。 
2、START_NOT_STICKY或START_REDELIVER_INTENT用於有命令需要處理時才執行的模式。 
服務不能自己執行,需要通過呼叫Context.startService()或Context.bindService()方法啟動服務。這兩個方法都可以啟動Service,但是它們的使用場合有所不同。 
1、 使用startService()方法啟用服務,呼叫者與服務之間沒有關連,即使呼叫者退出了,服務仍然執行。 
如果打算採用Context.startService()方法啟動服務,在服務未被建立時,系統會先呼叫服務的onCreate()方法,接著呼叫onStart()方法。 
如果呼叫startService()方法前服務已經被建立,多次呼叫startService()方法並不會導致多次建立服務,但會導致多次呼叫onStart()方法。 
採用startService()方法啟動的服務,只能呼叫Context.stopService()方法結束服務,服務結束時會呼叫onDestroy()方法。 
2、使用bindService()方法啟用服務,呼叫者與服務繫結在了一起,呼叫者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點。 
onBind()只有採用Context.bindService()方法啟動服務時才會回撥該方法。該方法在呼叫者與服務繫結時被呼叫,當呼叫者與服務已經繫結,多次呼叫Context.bindService()方法並不會導致該方法被多次呼叫。採用Context.bindService()方法啟動服務時只能呼叫onUnbind()方法解除呼叫者與服務解除,服務結束時會呼叫的onDestroy()方法。擁有服務的程序具有較高的優先順序1.如果service正在呼叫onCreate,onStartCommand或者onDestory方法,那麼用於當前service的程序則變為前臺程序以避免被殺死。2.如果當前服務已經被啟動(start),擁有它的程序則比那些使用者可見的程序優先順序低一些,但是比那些不可見的程序更重要,這就意味著服務一般不會被殺死。3。如果客戶端已經連線到service(bindService),那麼擁有Service的程序則擁有最高的優先順序,可以認為service是可見的。4.如果service可以使用startForeground(int,Notification)方法來將service設定為前臺狀態,那麼系統就認為是對使用者可見的,並不會在記憶體不足時被殺。如果有其他的應用元件作為服務,活動等執行在相同的程序中,那麼將會增加該程序的重要性。本地服務1.不需和活動互動的本地服務2.本地服務和活動互動\ ———————–

三、Broadcast Receiver 
是一個全域性的監聽器,屬於Android四大元件之一 
作用是監聽 / 接收 應用 App 發出的廣播訊息,並 做出響應 
應用場景為

1、Android不同元件間的通訊 
2、多執行緒通訊 
3、與Android系統在特定情況下的通訊

四、Content Provider詳解

ContentProvider(內容提供者)是Android中的四大元件之一。主要用於對外共享資料,也就是通過ContentProvider把應用中的資料共享給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的資料進行操作。ContentProvider分為系統的和自定義的,系統的也就是例如聯絡人,圖片等資料。 
android中對資料操作包含有: 
file, sqlite3, Preferences,ContectResolver與ContentProvider前三種資料操作方式都只是針對本應用內資料,程式不能通過這三種方法去操作別的應用內的資料。 
android中提供ContectResolver與ContentProvider來操作別的應用程式的資料。 
使用方式: 
一個應用實現ContentProvider來提供內容給別的應用來操作, 
一個應用通過ContentResolver來操作別的應用資料,當然在自己的應用中也可以。 
1.ContentProvider 
Android提供了一些主要資料型別的ContentProvider,比如音訊、視訊、圖片和私人通訊錄等。可在android.provider包下面找到一些Android提供的ContentProvider。通過獲得這些ContentProvider可以查詢它們包含的資料,當然前提是已獲得適當的讀取許可權。

2.ContentResolver 
當外部應用需要對ContentProvider中的資料進行新增、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要獲取ContentResolver物件,可以使用Context提供的getContentResolver()方法。 
3.Uri 
Uri指定了將要操作的ContentProvider,其實可以把一個Uri看作是一個網址,我們把Uri分為三部分。 
第一部分是”content://”。可以看作是網址中的”http://”。 
第二部分是主機名或authority,用於唯一標識這個ContentProvider,外部應用需要根據這個標識來找到它。可以看作是網址中的主機名,比如”blog.csdn.net”。 
第三部分是路徑名,用來表示將要操作的資料。可以看作網址中細分的內容路徑。

作者:陳進楊

原文連結:點選這裡
--------------------- 
作者:fjnu_se 
來源:CSDN 
原文:https://blog.csdn.net/fjnu_se/article/details/80854205 
版權宣告:本文為博主原創文章,轉載請附上博文連結!