簡單說說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的相關方法
- 啟動指定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的事件廣播模型
