1. 程式人生 > >Android四大元件詳細介紹及例子

Android四大元件詳細介紹及例子

這個文章主要是講Android開發的四大元件,本文主要分為

一、Activity詳解
二、Service詳解
三、Broadcast Receiver詳解
四、Content Provider詳解
外加一個重要元件 intent的詳解。



一、Activity詳解
Activty的生命週期的也就是它所在程序的生命週期。


1.jpg 

一個Activity的啟動順序:

onCreate()——>onStart()——>onResume()

當另一個Activity啟動時:
第一個Activity onPause()——>第二個Activity    
onCreate()——>onStart()——>onResume() 

——>第一個Activity   onStop()

當返回到第一個Activity時:
第二個Activity onPause() ——> 第一個Activity onRestart()——>onStart()——>onResume() 
——>第二個Activity   onStop()——>onDestroy()

一個Activity的銷燬順序:
(情況一)onPause()——>
<Process Killed> 

(情況二)onPause()——>onStop()——><Process Killed> 
(情況三)onPause()——>onStop()——>onDestroy()

  每一個活動( Activity )都處於某一個狀態,對於開發者來說,是無法控制其應用程式處於某一個狀態的,這些均由系統來完成。

  但是當一個活動的狀態發生改變的時候,開發者可以通過呼叫 onXX() 的方法獲取到相關的通知資訊。

  在實現 Activity 類的時候,通過覆蓋( override )這些方法即可在你需要處理的時候來呼叫。



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

  Activity棧
  上面提到開發者是無法控制Activity的狀態的,那Activity的狀態又是按照何種邏輯來運作的呢?這就要知道 Activity 棧。
  每個Activity的狀態是由它在Activity棧(是一個後進先出LIFO,包含所有正在執行Activity的佇列)中的位置決定的。
  當一個新的Activity啟動時,當前的活動的Activity將會移到Activity棧的頂部。
  如果使用者使用後退按鈕返回的話,或者前臺的Activity結束,活動的Activity就會被移出棧消亡,而在棧上的上一個活動的Activity將會移上來並變為活動狀態。如下圖所示:2.jpg   一個應用程式的優先順序是受最高優先順序的Activity影響的。當決定某個應用程式是否要終結去釋放資源,Android記憶體管理使用棧來決定基於Activity的應用程式的優先順序。
  Activity狀態
  一般認為Activity有以下四種狀態:
  活動的:當一個Activity在棧頂,它是可視的、有焦點、可接受使用者輸入的。Android試圖盡最大可能保持它活動狀態,殺死其它Activity來確保當前活動Activity有足夠的資源可使用。當另外一個Activity被啟用,這個將會被暫停。
  暫停:在很多情況下,你的Activity可視但是它沒有焦點,換句話說它被暫停了。有可能原因是一個透明或者非全屏的Activity被啟用。
  當被暫停,一個Activity仍會當成活動狀態,只不過是不可以接受使用者輸入。在極特殊的情況下,Android將會殺死一個暫停的Activity來為活動的Activity提供充足的資源。當一個Activity變為完全隱藏,它將會變成停止。
  停止:當一個Activity不是可視的,它“停止”了。這個Activity將仍然在記憶體中儲存它所有的狀態和會員資訊。儘管如此,當其它地方需要記憶體時,它將是最有可能被釋放資源的。當一個Activity停止後,一個很重要的步驟是要儲存資料和當前UI狀態。一旦一個Activity退出或關閉了,它將變為待用狀態。
  待用: 在一個Activity被殺死後和被裝在前,它是待用狀態的。待用Acitivity被移除Activity棧,並且需要在顯示和可用之前重新啟動它。
  activity的四種載入模式
  在android的多activity開發中,activity之間的跳轉可能需要有多種方式,有時是普通的生成一個新例項,有時希望跳轉到原來某個activity例項,而不是生成大量的重複的activity。載入模式便是決定以哪種方式啟動一個跳轉到原來某個Activity例項。
  在android裡,有4種activity的啟動模式,分別為:
  ·standard: 標準模式,一呼叫startActivity()方法就會產生一個新的例項。
  ·singleTop: 如果已經有一個例項位於Activity棧的頂部時,就不產生新的例項,而只是呼叫Activity中的newInstance()方法。如果不位於棧頂,會產生一個新的例項。
  ·singleTask: 會在一個新的task中產生這個例項,以後每次呼叫都會使用這個,不會去產生新的例項了。
  ·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的元素的特性值互動控制。
  下面是影響載入模式的一些特性
  核心的Intent Flag有:
  FLAG_ACTIVITY_NEW_TASK
  FLAG_ACTIVITY_CLEAR_TOP
  FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
  FLAG_ACTIVITY_SINGLE_TOP

核心的特性有:
  taskAffinity
  launchMode
  allowTaskReparenting
  clearTaskOnLaunch
  alwaysRetainTaskState
  finishOnTaskLaunch

 四種載入模式的區別
  所屬task的區別
  一般情況下,“standard”和”singleTop”的activity的目標task,和收到的Intent的傳送者在同一個task內,就相當於誰呼叫它,它就跟誰在同一個Task中。
  除非Intent包括引數FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK引數,會啟動到別的task裡。
  “singleTask”和”singleInstance” 總是把要啟動的activity作為一個task的根元素,他們不會被啟動到一個其他task裡。
  是否允許多個例項
  “standard”和”singleTop”可以被例項化多次,並且是可以存在於不同的task中;這種例項化時一個task可以包括一個activity的多個例項;
  “singleTask”和”singleInstance”則限制只生成一個例項,並且是task的根元素。
  singleTop 要求如果建立intent的時候棧頂已經有要建立的Activity的例項,則將intent傳送給該例項,而不建立新的例項。
  是否允許其它activity存在於本task內
  “singleInstance”獨佔一個task,其它activity不能存在那個task裡;
  如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task裡執行(如同加了FLAG_ACTIVITY_NEW_TASK引數)。
  而另外三種模式,則可以和其它activity共存。
  是否每次都生成新例項
  “standard”對於每一個啟動Intent都會生成一個activity的新例項;
  “singleTop”的activity如果在task的棧頂的話,則不生成新的該activity的例項,直接使用棧頂的例項,否則,生成該activity的例項。
  比如:
  現在task棧元素為A-B-C-D(D在棧頂),這時候給D發一個啟動intent,如果D是 “standard”的,則生成D的一個新例項,棧變為A-B-C-D-D。
  如果D是singleTop的話,則不會生產D的新例項,棧狀態仍為A-B-C-D
  如果這時候給B發Intent的話,不管B的launchmode是”standard” 還是 “singleTop” ,都會生成B的新例項,棧狀態變為A-B-C-D-B。
  “singleInstance”是其所在棧的唯一activity,它會每次都被重用。
  “singleTask” 如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前臺。 當已經存在的activity例項處理新的intent時候,會呼叫onNewIntent()方法,如果收到intent生成一個activity例項,那麼使用者可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,使用者不能通過按back鍵返回到這之前的狀態。
-----------------------------------
二、Service詳解

  service可以在和多場合的應用中使用,比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後臺繼續播放,比如檢測SD卡上檔案的變化,再或者在後臺記錄你地理資訊位置的改變等等,總之服務嘛,總是藏在後頭的。

  Service是在一段不定的時間執行在後臺,不和使用者互動應用元件。每個Service必須在manifest中 通過<service>來宣告。可以通過contect.startservice和contect.bindserverice來啟動。

  Service和其他的應用元件一樣,執行在程序的主執行緒中。這就是說如果service需要很多耗時或者阻塞的操作,需要在其子執行緒中實現。

  service的兩種模式(startService()/bindService()不是完全分離的):

  本地服務 Local Service 用於應用程式內部。

  它可以啟動並執行,直至有人停止了它或它自己停止。在這種方式下,它以呼叫Context.startService()啟動,而以呼叫Context.stopService()結束。它可以呼叫Service.stopSelf() 或 Service.stopSelfResult()來自己停止。不論呼叫了多少次startService()方法,你只需要呼叫一次stopService()來停止服務。

  用於實現應用程式自己的一些耗時任務,比如查詢升級資訊,並不佔用應用程式比如Activity所屬執行緒,而是單開執行緒後臺執行,這樣使用者體驗比較好。
  遠端服務 Remote Service 用於android系統內部的應用程式之間。

  它可以通過自己定義並暴露出來的介面進行程式操作。客戶端建立一個到服務物件的連線,並通過那個連線來呼叫服務。連線以呼叫Context.bindService()方法建立,以呼叫 Context.unbindService()關閉。多個客戶端可以繫結至同一個服務。如果服務此時還沒有載入,bindService()會先載入它。

  可被其他應用程式複用,比如天氣預報服務,其他應用程式不需要再寫這樣的服務,呼叫已有的即可。

 生命週期

使用context.startService() 啟動Service是會會經歷:

  context.startService() ->onCreate()- >onStart()->Service running

  context.stopService() | ->onDestroy() ->Service stop

  如果Service還沒有執行,則android先呼叫onCreate()然後呼叫onStart();如果Service已經執行,則只調用onStart(),所以一個Service的onStart方法可能會重複呼叫多次。

  stopService的時候直接onDestroy,如果是呼叫者自己直接退出而沒有呼叫stopService的話,Service會一直在後臺執行。該Service的呼叫者再啟動起來後可以通過stopService關閉Service。

  所以呼叫startService的生命週期為:onCreate --> onStart(可多次呼叫) --> onDestroy
  使用使用context.bindService()啟動Service會經歷:

  context.bindService()->onCreate()->onBind()->Service running

  onUnbind() -> onDestroy() ->Service stop

  onBind將返回給客戶端一個IBind介面例項,IBind允許客戶端回撥服務的方法,比如得到Service執行的狀態或其他操作。這個時候把呼叫者(Context,例如Activity)會和Service繫結在一起,Context退出了,Srevice就會呼叫onUnbind->onDestroy相應退出。

  所以呼叫bindService的生命週期為:onCreate --> onBind(只一次,不可多次繫結) --> onUnbind --> onDestory。

  在Service每一次的開啟關閉過程中,只有onStart可被多次呼叫(通過多次startService呼叫),其他onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被呼叫一次。

而啟動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()方法。

  看看官方給出的比較流程示意圖:

  官方文件告訴我們,一個service可以同時start並且bind,在這樣的情況,系統會一直保持service的執行狀態如果service已經start了或者BIND_AUTO_CREATE標誌被設定。如果沒有一個條件滿足,那麼系統將會呼叫onDestory方法來終止service.所有的清理工作(終止執行緒,反註冊接收器)都在onDestory中完成。

  擁有service的程序具有較高的優先順序

  官方文件告訴我們,Android系統會盡量保持擁有service的程序執行,只要在該service已經被啟動(start)或者客戶端連線(bindService)到它。當記憶體不足時,需要保持,擁有service的程序具有較高的優先順序。

  1. 如果service正在呼叫onCreate,onStartCommand或者onDestory方法,那麼用於當前service的程序則變為前臺程序以避免被killed。

  2. 如果當前service已經被啟動(start),擁有它的程序則比那些使用者可見的程序優先順序低一些,但是比那些不可見的程序更重要,這就意味著service一般不會被killed.

  3. 如果客戶端已經連線到service (bindService),那麼擁有Service的程序則擁有最高的優先順序,可以認為service是可見的。

  4. 如果service可以使用startForeground(int, Notification)方法來將service設定為前臺狀態,那麼系統就認為是對使用者可見的,並不會在記憶體不足時killed。

  如果有其他的應用元件作為Service,Activity等執行在相同的程序中,那麼將會增加該程序的重要性。

  本地service

  1.不需和Activity互動的本地服務

  1. public class LocalService extends Service {

  2. private static final String TAG = "LocalService";

  3. @Override
  4. public IBinder onBind(Intent intent) {
  5. Log.i(TAG, "onBind");
  6. return null;
  7. }

  8. @Override
  9. public void onCreate() {
  10. Log.i(TAG, "onCreate");
  11. super.onCreate();
  12. }

  13. @Override
  14. public void onDestroy() {
  15. Log.i(TAG, "onDestroy");
  16. super.onDestroy();
  17. }

  18. @Override
  19. public void onStart(Intent intent, int startId) {
  20. Log.i(TAG, "onStart");
  21. super.onStart(intent, startId);
  22. }
  23. }
複製程式碼   Activity:
  1. public class ServiceActivity extends Activity {

  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.servicedemo);

  6. ((Button) findViewById(R.id.startLocalService)).setOnClickListener(
  7. 相關推薦

    Android四大元件詳細介紹例子

    這個文章主要是講Android開發的四大元件,本文主要分為 一、Activity詳解 二、Service詳解 三、Broadcast Receiver詳解 四、Content Provider詳解 外加一個重要元件 intent的詳解。 一、Activity詳解 Activty的生命週期

    android四大元件(詳細總結)

    android四大元件分別為activity、service、content provider、broadcast receiver。 一、android四大元件詳解 1、activity (1)一個Activity通常就是一個單獨的螢幕(視窗)。 (2)Activi

    Android--四大元件之BroadCastReceiver(生命週期、實現原理使用等)

    ####1. BroadCastReceiver是什麼? ####2. 廣播型別 ######1). 有序廣播 ######2). 無序廣播 ####3. 生命週期 ####4. 實現原理 ####5. 使用方法 ####6. 許可權問題(安全性) ####7. LocalBroad

    Android基本UI控制元件介紹使用

    1      基本UI Zealer、CSDN、github StormZhang、 張弘揚(Hyman):http://blog.csdn.net/lmj623565791?viewmode=contents 、任玉剛:http://blog.csdn.net/sing

    android四大元件介紹

    最近正在學習UC Berkeley的CS61B這門課,主要是採用Java語言去實現一些資料結構以及運用資料結構去做一些project。這門課不僅告訴你這個東西怎麼做,而且一步一步探尋為什麼要這樣做以及為什麼會有這些功能。我們有時在接觸某段程式碼或功能的實現時,可能直接就看到了

    Android 四大元件之Service使用特點

    1. 生命週期 常用方法 官方說明圖 示意圖 在Service的生命週期裡,常用的有: 4個手動呼叫的方法 手動呼叫方法 作用 startService() 啟動服務 stopService() 關閉服務 bindService

    轉---CentOS安裝Oracle數據庫詳細介紹常見問題匯總

    cati res export 硬件 image centos 6 bin pre 數據庫安裝 一、安裝前準備 1.軟件硬件要求 操作系統:CentOS 6.4(32bit)Oracle數據庫版本:Oracle 10g(10201_database_linux32.zi

    linux安裝系統分區詳細介紹常用ls命令

    自動分區 fff 英語基礎 沒有 擁有 inux 文件夾 swap user linux對於沒有基礎的初學者來說,最難的就是第一步,不為什麽因為萬事開頭難,第一步就是裝系統分區,而這裏面最難的我認為就是分區部分,如果是讓系統自動分區那就很簡單,但對於初學者一般都是要手動分區

    CentOS 6.9配置網卡IP/網關/DNS命令詳細介紹一些常用網絡配置命令(轉)

    linux. centos fly fig details oba routing href 修改dns 一、IP 即時生效(重啟後失效): ifconfig eth0 192.168.1.102 netmask 255.255.255.0 //添加IP地址 r

    Oracle 11g服務詳細介紹哪些服務是必須開啟的?

    系統 創建 span rac div 哪些 能夠 對象 sql*plus 按照windows 7 64位 安裝oracle 11g R2中的方法成功安裝Oracle 11g後,共有7個服務,這七個服務的含義分別為: 1. Oracle ORCL VSS Writer Se

    Oracle 11g服務詳細介紹必須開啟的服務

    home 映射 遠程訪問 cover AC 管理器 ise 默認 影響 按照windows 7 64位 安裝oracle 11g R2中的方法成功安裝Oracle 11g後,共有7個服務,這七個服務的含義分別為: 1. Oracle ORCL VSS Writer Serv

    Android四大元件——BroadcastReceiver(原理篇)

    前言 Android四大元件——BroadcastReceiver(基礎篇)裡面介紹了BroadcastReceiver相關的基礎知識,本文將從Android 8.0原始碼來分析一下廣播的註冊和接收原理。 BroadcastReceiver的註冊 Android系統中Broa

    Android 上層wifi簡單介紹程式碼演示

    閒來無事,研究一下Android的wifi模組。 涉及到的類: *1.WifiManager:管理wifi連線的service,可由getSystemService(Context.WIFI_SERVICE)獲取* *2.ScanResult:包含wifi的SSID、B

    《瞭解Android四大元件 》的補充

    Activity View元件是所有UI控制元件、容器控制元件的基類,View元件就是Android應用中使用者實實在在看到的部分。但View元件需要放到容器元件中,或者使用Activity將它顯示出來。如果需要通過某個Activity把指定的View顯示出來,呼叫Activit

    瞭解Android四大元件

    Activity 用途:Activity是一個應用程式元件,其所有操作都與使用者密切相關,它提供一個螢幕,在此進行使用者互動從而完成某項任務。(是使用者操作的視覺化介面;它為使用者提供了一個完成操作指令的視窗)在一個android應用中,一個Activity通常就是一個單獨的螢幕,它上面

    Android 四大元件android:exported 屬性詳解

    當我們在用360等檢測軟體掃描應用漏洞時,掃描結果可能歸類為安全漏洞,涉及一個Android:exported屬性,這個屬性究竟是用來幹嘛的呢,詳情見下圖: 因此,查了官方API,學習了一下這個屬性! android:exported 是Android中的四大元件 Ac

    android四大元件--使用LocalBroadcast進行應用內資料傳遞

    1.區別:本地廣播的傳送和接受,只能在一個程序中。因此在跨程序中的通訊是不能使用的。比如建立了新的程序或者是在不同app之間通訊都是不能使用。 但是在不同的執行緒中是能夠進行傳送和接受資料。因此保證了廣播的安全問題。 2.使用是通過LocalBroadcastManager獲取到獲取例項進行

    區塊鏈ICO發幣的全部流程詳細介紹費用問題

    區塊鏈ico發幣在我國已經被禁止了,但是仍然有很多人在從事區塊鏈創業工作。並且隨著市場的越來越成熟,趨於穩定的常態下。更多的人看到了在區塊鏈創業的可能。下面就來詳細說一下怎麼進行區塊鏈ico發幣。首先就是註冊個海外公司做為發幣的主體,大部分專案方是註冊的新加坡非盈利基金會。註冊基金會需要你提供兩個東西。第一、

    Android 四大元件之Service的啟動、繫結小述

    一、概述 學習過Android的小夥伴就不可能不知道Service是什麼,因為Service是Android四大元件之一,聲名赫赫有木有,所以在這裡我就不詳細介紹了,本節主要還是充當筆記的作用,因為我待記性如初戀,記性虐我千百遍。 二、Service的建立 Service是一

    Android 四大元件之——Service(一)

    一、什麼是服務        服務,是Android四大元件之一, 屬於 計算型元件。   長期後臺執行的沒有介面的元件 ,特點是無使用者介面、在後臺執行、生命週期長 二,什麼時候使用服務?