一個Android應用通常由一個或多個基本組件組成,常用的一般有Activity、Service、BroadcastReceiver、ContentProvider、Intent等等。
⒈Activity和View
Activity時Android中負責與用戶進行交互的組件。Activity只能通過setContentView(View)來顯示指定組件。
View組件是所有UI控件、容器控件的基類,View組件就是Android應用中用戶看到的部分。View組件需要放到容器組件中或使用Activity將它顯示出來。如果需要通過某個Activity把指定的View顯示出來,調用Activity的setContentView()方法即可。
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 //setContentView()方法可接收一個View作為參數 5 //創建一個線性布局管理器 6 LinearLayout layout = new LinearLayout(this); 7 //設置該Activity顯示layout 8 setContentView(layout); 9 }
setContentView()方法也可接收一個布局管理資源的ID作為參數
1 @Override 2 protected void onCreate(Bundle savedInstanceState) { 3 super.onCreate(savedInstanceState); 4 //設置該Activity顯示activity_main.xml文件定義的View 5 setContentView(R.layout.activity_main); 6 }
Activity為Android應用提供了可視化用戶界面,如果Android應用需要多個用戶界面,那么這個Android應用將會包含多個Activity,而多個Activity又組成了一個Activity棧,當前活動的Activity位於棧頂。
實際上Activity是Window的容器,Activity包含一個getWindow()方法,該方法返回該Activity所包含的窗口。
如果應用程序不調用Activity的setContentView()來設置該窗口的顯示內容,那么該程序將顯示一個空窗口。Activity包含了一個setTheme(int resid)方法來設置其窗口的風格。例如,我們希望窗口不顯示ActionBar、以對話框的形式顯示窗口等都可以通過該方法來實現。
⒉Service
Service與Activity的地位是並列的,它也代表一個單獨的Android組件。Service與Activity的區別在於:Service通常位於后台運行,它一般不需要與用戶交互,因此Service組件沒有圖形界面。
與Activity組件需要繼承Activity基類相似,Service組件需要繼承Service基類。一個Service組件被運行起來之后,它將擁有自己獨立的生命周期,Service組件通常用於為其他組件提供后台服務或監控其他組件的運行狀態。
⒊BroadcastReceiver
BroadcastReceiver指Android中的廣播消息接收器,BroadcastReceiver類似於事件編程中的監聽器。與普通事件監聽器不同的是,普通事件監聽器監聽的事件源是程序中的對象,而BroadcastReceiver監聽的事件源是Android中的其他組件,因此BroadcastReceiver相當於一個全局的事件監聽器。
使用BroadcastReceiver組件接收廣播消息比較簡單,只需要繼承BroadcastReceiver抽象類並重寫onReceive(Context context,Intent intent)方法即可。當其他組件通過sendBroadcast()、sendStickyBroadcast()或sendOrderedBroadcast()方法發送廣播消息時,如果該BroadcastReceiver也對該消息“感興趣”(通過IntentFilter設置),BroadcastReceiver的onReceive(Context context,Intent intent)方法將會被觸發。
開發者實現了自己的BroadcastReceiver之后,通常由兩種方式來注冊這個系統級的“事件監聽器”
1.在Java或Kotlin代碼中通過Context.registReceiver()方法注冊BroadcastReceiver
2.在AndroidManifest.xml文件中使用<receiver>元素進行注冊
⒋ContentProvider
Android通過ContentProvider組件在多個應用程序之間進行數據交換。
實現方式是繼承ContentProvider抽象類並重寫以下抽象方法:
1.insert(Uri,ContentValuts):向ContentProvider插入數據
2.delete(Uri,ContentValuts):刪除ContentProvider中指定數據
3.update(Uri,ContentValuts,String,String[]):更新ContentProvider中指定數據
4.query(Uri,String[],String,String[],String):從ContentProvider中查詢數據
通常與ContentProvider結合使用的是ContentResolver,一個應用程序使用ContentProvider暴露自己的數據,而另一個程序則通過ContentResolver來訪問數據。
⒌Intent和IntentFilter
Intent並不是Android應用的組件,它是Android應用內不同組件之間通信的載體。當Android運行時需要連接不同的組件時,通常就需要借助於Intent來實現。
Intent可以啟動應用中的另一個Activity,也可以啟動一個Service組件,還可以發送一條廣播消息來觸發系統中的BroadcastReceiver。也就是說,Activity、Service、BroadcastReceiver三種組件之間的通信都以Intent作為載體,只是不同組件使用Intent的機制略有區別而已。
1.Activity:當需要啟動一個Activity時,可嗲用Context的startActivity(Intent intent)或startActivityForResult(Intent intent,int requestCode)方法,這兩個方法中的Intent參數封裝了需要啟動的目標Activity信息。
2.Service:當需要啟動一個Service時,可調用Context的startService(Intent intent)或bindService(Intent service,ServiceConnection conn,int flags)方法,這兩個方法中的Intent參數封裝了需要啟動的目標Service信息
3.BroadcastReceiver:當需要觸發一個BroadcastReceiver時,可調用Context的sendBroadcast(Intent intent)、sendStickyBroadcast(Intent intent)或sendOrderedBroadcast(Intent intent,String receiverPermission)方法來發送廣播消息,這三個方法中的Intent參數封裝了需要觸發目標BroadcastReceiver的信息。
Intent封裝了當前組件需要啟動或觸發的目標組件的信息,當一個組件通過Intent表示了啟動或觸發另一個組件的“意圖”之后,這個意圖可分為兩類
1.顯式Intent:顯式Intent明確指定了需要啟動或者觸發的組件類名。
2.隱式Intent:隱式Intent只是指定需要啟動或者觸發的組件應滿足怎樣的條件。
對於顯式Intent而言,Android系統無須對該Intent做任何解析,系統直接找到指定的目標組件啟動或觸發它即可。
對於隱式Intent而言,Android系統需要對該Intent進行解析,解析出它的條件,然后再去系統中查找與之匹配的目標組件去啟動或觸發他們。
Android通過IntentFilter來判斷被調用組件是否符合隱式Intent的條件,被調用組件可通過IntentFilter來聲明自己所滿足的條件(也就是聲明自己到底能處理那些隱式Intent)。