Android四大組件


簡單說說Android的四大套件.

我們都知道Android四大套件有Activity.Service.Content Provider.Broadcast Receiver,最常見的便是Activity以及Service.

Activity

  • 什么是Activity:Activity和我們所學的Servlet一樣,和客戶端服務器打交道

                    Activity是一個負責與用戶交互的組件,Activity中所有操作都與用戶密切相關,可以通過setContentView(View)來顯示指定控件。

                    在一個android應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監聽並處理用戶的事件做出響應。

                    Activity是一種界面系統,只要是界面系統就包含三個組成(控件,布局,事件)

  • 以下是一個用XMind總結的Activity簡介

  • Activity生命周期   

      onCreate(Bundle savedInstanceState):

            創建activity時調用。設置在該方法中,還以Bundle的形式提供對以前儲存的任何狀態的訪問!

      onStart():

            activity變為在屏幕上對用戶可見時調用。

      onResume():

            activity開始與用戶交互時調用(無論是啟動還是重新啟動一個活動,該方法總是被調用的)。

      onPause():

            activity被暫停或收回cpu和其他資源時調用,該方法用於保存活動狀態的,也是保護現場,壓棧吧!

      onStop():

            activity被停止並轉為不可見階段及后續的生命周期事件時調用。

      onRestart():

            重新啟動activity時調用。該活動仍在棧中,而不是啟動新的活動。

      onDestroy():

            activity被完全從系統內存中移除時調用,該方法被調用

  • 兩個子循環,子生命周期

      第一層(內層)循環是:焦點的生命周期循環,在當前Activity的焦點獲得與失去中循環,在這個過程中,Activity是始終可見的

      onPause()->onResume()->onPause()

      第二層(外層)循環是Activity周期循環,是當前Activity在可見和不可見之間循環

      onStart()->onResume()->onResume()->onPause()->onStop()

  • 生命周期划分:整體生命周期:onCreate()->...-onDestory()

                  可視生命周期:onStart()->...->onStop()

                  焦點生命周期:onResume()->onPause()

  • 以下是一個Activity生命周期圖

  • 以下是用法,示例的參考

 

  • Activity常用方法:

       setContentView(int resId):設置Activity顯示的布局

       View findViewById(int resId)

       finish():關閉當前的activity

  • Activity在屏幕旋轉時的生命周期:   

      不設置Activity的android:configChanges時,切屏會重新調用各個生命周期,切橫屏時會執行一次,切豎屏時會執行兩次;

      設置Activity的android:configChanges="orientation"時,切屏還是會重新調用各個生命周期,切橫、豎屏時只會執行一次;

      設置Activity的android:configChanges="orientation|keyboardHidden"時,切屏不會重新調用各個生命周期,只會執行onConfigurationChanged方法。

  • Activity啟動模式: 

      在android里,有4種activity的啟動模式,分別為:standard (默認)  singleTop  singleTask  singleInstance

      當應用運行起來后就會開啟一條線程,線程中會運行一個任務棧,當Activity實例創建后就會放入任務棧中。Activity啟動模式的設置在AndroidManifest.xml文件中,通過配置Activity的屬性android:launchMode=""設置。   

      1. Standared模式(默認)

          我們平時直接創建的Activity都是這種模式的Activity,這種模式的Activity的特點是:只要你創建了Activity實例,一旦激活該Activity,則會向任務棧中加入新創建的實例,

          退出Activity則會在任務棧中銷毀該實例。

      2. SingleTop模式

          這種模式會考慮當前要激活的Activity實例在任務棧中是否正處於棧頂,如果處於棧頂則無需重新創建新的實例,會重用已存在的實例,否則會在任務棧中創建新的實例。

      3. SingleTask模式

          如果任務棧中存在該模式的Activity實例,則把棧中該實例以上的Activity實例全部移除,調用該實例的newInstance()方法重用該Activity,使該實例處於棧頂位置,否則就重新創建一個新的Activity實例。

      4. SingleInstance模式

          當該模式Activity實例在任務棧中創建后,只要該實例還在任務棧中,即只要激活的是該類型的Activity,都會通過調用實例的newInstance()方法重用該Activity,此時使用的都是同一個Activity實例,它都會處於任務棧的棧頂。此模式一般用於加載較慢的,比較耗性能且不需要每次都重新創建的Activity。

Service

  • 以下是一個用XMind編寫的Service概述

 

  • Service組件開發      

        第一步:繼承Service類  public class SMSService extends Service {}

        第二步:在AndroidManifest.xml文件中的<application>節點里對服務進行配置:<service android:name=".SMSService" />

        第三步:啟動服務

        方法一:context.startService():調用者與服務之間沒有關連,即使調用者退出了,服務仍然運行

        方法二:context.bindService():調用者與服務綁定在了一起,調用者一旦退出,服務也就終止,大有“不求同時生,必須同時死”的特點

  • 啟動/停止/綁定Service的相關方法
  1. 啟動指定Service

          pubic ComponentName StartService (Intent dervice)

          參數Intent,在該意圖中指定啟動的目標service.啟動方法有顯示意圖和隱式意圖兩種

          說明: startService()在ContextWrapper類中定義,該類的父類是Context

          ContextWrapper類是Activity的間接父類和Service的直接父類

          實例:Intent intent = new Intent(元組件,目標Service.class);startService(intent);

      2. 停止Service

          boolean stopService(Intent Service)

          和啟動相同

          stopService 方法在ContextWrapper類中定義

      3. 在Service內部停止Service

          final stopSelf()

          該方法不會回調Service中的onDestory方法

      4. 與intent指定的目標Service綁定

          bindService(Intent, ServiceConnection, int flag)

          intent:啟動intent對象中指定目標的Service

          conn:實現了ServiceConnection接口的對象,該對象用於監聽訪問者與service之間的綁定情況,成功后將調用SCNN對象的onServiceConnectend方法

          flags:綁定時是否自動創建Service.值為0是不自動創建Service當Bind_AUTO_CREATE常量(值為1)時,自動創建Service

          Service和其綁定的activity生命周期之間的關系

      5. ServiceConnection接口

          作用:用於監聽訪問者與Service之間的連接情況,該接口定義了兩個方法

          onServiceconnected(Conponentname name, INinder Service)

          作用:綁定成功是觸發本方法

          name:被綁定的Service實例

          Service:通過被綁定的Service類中的onBind方法返回一個Ibinder類型的對象

          onServiceDisconnected(ConponontName name)

          綁定出現異常,引用程序出現崩潰時觸發本方法

      6. bubindService(ServiceConnection conn)

          解除conn相關的Service的綁定

          conn是一個實現了SCNN的接口的對象

          bubindService執行后,系統會回調Service的onDestory()方法

  • service生命周期       

         onCreate():

         該方法在服務被創建時調用,該方法只會被調用一次,無論調用多少次startService()或bindService()方法,服務也只被創建一次。

         onDestroy():

         該方法在服務被終止時調用。與采用Context.startService()方法啟動服務有關的生命周期方法

         onStart():

         只有采用Context.startService()方法啟動服務時才會回調該方法。該方法在服務開始運行時被調用。多次調用startService()方法盡管不會多次創建服務,但onStart()方法會被多次調用。

         onBind():

         只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務綁定時被調用,當調用者與服務已經綁定,多次調用Context.bindService()方法並不會導致該方法被多次調用。

         onUnbind():

         只有采用Context.bindService()方法啟動服務時才會回調該方法。該方法在調用者與服務解除綁定時被調用

  • Service綁定原理

        概述:1 一個Ser和一個activity只能綁定一次

               2 一個activity可以同時綁定多個Service

               3 一個ser可以和多個act綁定

               4 當綁定到一個Service,且講flag設置為BIND_AUTO_CREATE時,如果該Service未創建,在先創建ServiceonCreate0,然后在綁定,如果已創建,則直接綁定

               5 Ser被多個act綁定只有當所有客戶端被解綁才會被destory

               6 Binder類用於多個客戶端與服務端通信,Binder意思是別針,將客戶端與服務端綁定到一起

         綁定組件時數據傳遞分析(代碼)

         bindService與startservice比較:

               1 通過多次調用startService每次都觸發Service類中的onStartConnand(),並用Intent對象向Service傳遞不同的數據,從而達到控制Service,但是不方便

               2 通過綁定的方式,使用onBind傳遞給ServiceConnection的Ibinder控制Service方式比較便捷,實際開發中推薦使用這種方式

         關於onServiceDisconnected方法的調用:

               1 當activity與Service綁定是,若出現進程崩潰,則onServiceDisconnected方法將觸發

               2 當進程被終止是,將觸發onServiceDisConnected

               3 onServiceDisConnected方法由Android系統調用,不要程序觸發,不要在此方法中寫業務邏輯代碼

         onRebind():重新綁定

  • 隱式意圖啟動Service

         概述:1 使用隱式意圖可以啟動另外一個應用程序的服務,從而實現跨進程啟動服務

                2 在向清單中注冊Service是通過添加intent-filter,允許設備中其他應用程序通過隱式意圖啟動自己的Service

                提示:若不想讓其他應用程序啟動本程序中的Service,不要在Service標簽中聲明intent-filter

BroadCastReceiver

       概述:BroadcastReceiver用於接收並處理廣播通知(broadcastannouncements)。

              多數的廣播是系統發起的,如地域變換、電量不足、來電來信等。程序也可以播放一個廣播。程序可以有任意數量的 broadcast receivers來響應它覺得重要的通知。broadcast receiver可以通過多種方式通知用戶:啟動activity、使用NotificationManager、開啟背景燈、振動設備、播放聲音等,最典型的是在狀態欄顯示一個圖標,這樣用戶就可以點它打開看通知內容。通常我們的某個應用或系統本身在某些事件(電池電量不足、來電來短信)來臨時會廣播一個Intent出去,我們可以利用注冊一個Broadcast Receiver來監聽到這些Intent並獲取Intent中的數據。

       注冊廣播的幾種方以及這些方式有何優缺點?        

            首先寫一個類要繼承BroadcastReceiver

            第一種:在清單文件中聲明,添加

                  <receive android:name=".IncomingSMSReceiver " >

                  <intent-filter>

                       <action android:name="android.provider.Telephony.SMS_RECEIVED")

                  <intent-filter>

                  <receiver>   

            第二種使用代碼進行注冊如:

                  IntentFilter filter =  new

                  IntentFilter("android.provider.Telephony.SMS_RECEIVED");

                  IncomingSMSReceiver receiver = new IncomgSMSReceiver();

                  registerReceiver(receiver.filter);

            兩種注冊類型的區別是:

                  1)第一種不是常駐型廣播,也就是說廣播跟隨程序的生命周期。

                  2)第二種是常駐型,也就是說當應用程序關閉后,如果有信息廣播來,程序也會被系統調用自動運行。

ContentProvider        

            簡單敘述ContentProvider是如何實現數據共享的。

                 一個程序可以通過實現一個Content provider的抽象接口將自己的數據完全暴露出去,而且Content providers是以類似數據庫中表的方式將數據暴露。Content

providers存儲和檢索數據,通過它可以讓所有的應用程序訪問到,這也是應用程序之間唯一共享數據的方法。

                要想使應用程序的數據公開化,可通過2種方法:創建一個屬於你自己的Contentprovider或者將你的數據添加到一個已經存在的Content  provider中,前提是有相

同數據類型並且有寫入Content provider的權限。

                如何通過一套標准及統一的接口獲取其他應用程序暴露的數據?Android提供了ContentResolver,外界的程序可以通過ContentResolver接口訪問ContentProvider提供的數據。

 綜合

      Android的四大組件它們的作用          

            Activity:

            Activity是Android程序與用戶交互的窗口,是Android構造塊中最基本的一種,它需要為保持各界面的狀態,做很多持久化的事情,妥善管理生命周期以及一些跳轉邏輯

            service:

            后台服務於Activity,封裝有一個完整的功能邏輯實現,接受上層指令,完成相關的事物,定義好需要接受的Intent提供同步和異步的接口

            Content Provider:

            是Android提供的第三方應用數據的訪問方案,可以派生Content  Provider類,對外提供數據,可以像數據庫一樣進行選擇排序,屏蔽內部數據的存儲細節,向外提供統

一的接口模型,大大簡化上層應用,對數據的整合提供了更方便的途徑

            BroadCast Receiver:

            接受一種或者多種Intent作觸發事件,接受相關消息,做一些簡單處理,轉換成一條Notification,統一了Android的事件廣播模型

 

 

      

    

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM