快速了解安卓四大组件
安卓四大組件分別為
Activity 活動
Activity是用戶操作的可視化界面,它為用戶提供了一個完成操作指令的窗口。 需要在Activity創建時調用setContentView()來完成界面的顯示,為用戶提供交互的入口。
1、通常一個Activity就是一個屏幕
2、Activity之間通過Intent進行通信
3、安卓中每一個Activity都需要在AndroidMainFest.xml文件中聲明
Service? 服務?
Service(服務)是一個可以在后臺執行長時間運行操作而沒有用戶界面的應用組件,即使當前應用被切換到后臺,又或者用戶打開了另一個App,服務仍然可以保持正常運行。
1、啟動服務的Activity被銷毀也不會影響服務的運行,只有當進程被關閉時,Service也會被關閉
2、服務并不會自己開啟線程,所有的代碼都是默認運行在主線程中,也就是說我們需要在服務的內部手動開啟子線程,并在此執行耗時任務,否則就有可能出現主線程被阻塞的情況。
Service的兩種形式
? ? ? ? 1、started(啟動狀態)
? ? ? ? ? ? ? ? 當應用組件(如 Activity)通過調用 startService() 啟動服務時,服務即處于“啟動”狀態。一旦啟動,服務即可在后臺無限期運行,即使啟動服務的組件已被銷毀也不受影響,除非手動調用才能停止服務, 已啟動的服務通常是執行單一操作,而且不會將結果返回給調用方。
? ? ? ? 2、bound(綁定狀態)
? ? ? ? ? ? ? ? 當應用組件通過調用 bindService() 綁定到服務時,服務即處于“綁定”狀態。綁定服務提供了一個客戶端-服務器接口,允許組件與服務進行交互、發送請求、獲取結果,甚至是利用進程間通信 (IPC) 跨進程執行這些操作。 僅當與另一個應用組件綁定時,綁定服務才會運行。 多個組件可以同時綁定到該服務,但全部取消綁定后,該服務即會被銷毀。
Service在AndroidMainFest.xml中的聲明
?
android:exported:代表是否能被其他應用隱式調用,其默認值是由service中有無intent-filter決定的,如果有intent-filter,默認值為true,否則為false。為false的情況下,即使有intent-filter匹配,也無法打開,即無法被其他應用隱式調用。
android:name:對應Service類名
android:permission:是權限聲明
android:process:是否需要在單獨的進程中運行,當設置為android:process=”:remote”時,代表Service在單獨的進程中運行。注意“:”很重要,它的意思是指要在當前進程名稱前面附加上當前的包名,所以“remote”和”:remote”不是同一個意思,前者的進程名稱為:remote,而后者的進程名稱為:App-packageName:remote。
android:isolatedProcess :設置 true 意味著,服務會在一個特殊的進程下運行,這個進程與系統其他進程分開且沒有自己的權限。與其通信的唯一途徑是通過服務的API(bind and start)。
android:enabled:是否可以被系統實例化,默認為 true,因為父標簽也有enable屬性,所以必須兩個都為默認值 true 的情況下服務才會被激活,否則不會激活。
Content? Provider?內容提供者
ContentProvider 主要用于在不同的應用程序之間實現數據共享的功能。
它提供了一套完整的機制,允許一個程序訪問另外一個程序的數據,同時還能保證被訪問數據的安全性。目前使用 Content Provider 是 Android 實現跨進稱共享數據的標準方式。
Content Provider 不同于?文件存儲?和?ShardPreferences存儲?全局可讀寫操作模式,它可以選擇只對哪一部分數據進行共享,從而保證我們程序中的隱私數據不會有泄漏的風險。
Content Provider 的用法一般有兩種:
一。使用現有的內容提供器來讀取和操作相應程序中的數據;?
二。創建自己的內容提供器給我們程序的數據提供外部訪問接口
如果一個應用程序通過內容提供器對其數據提供了外部訪問接口,那么任何其他的應用程序就都可以對這部分數據進行訪問。 例如:系統中自帶的電話簿、短信、媒體庫等
程序都提供了類似的訪問接口,這就使得第三方應用程序可以充分的利用這部分數據來實現更好的功能。
Broadcast? Receiver? 廣播接收者
一、什么是BroadcastReceiver
BroadcastReceiver 是安卓系統中四大組件之一,在Android開發中,BroadcastReceiver的應用場景非常多,Android 廣播分為兩個角色:廣播發送者、廣播接收者。
1.1、作用
廣播接收器用于響應來自其他應用程序或者系統的廣播消息。
不同組件之間通信(包括應用內 / 不同應用之間)
與 Android 系統在特定情況下的通信(如當電話呼入時、網絡可用時)
多線程通信
1.2、實現原理
Android中的廣播使用了設計模式中的觀察者模式:基于消息的發布/訂閱事件模型。
模型中有3個角色:
消息訂閱者(廣播接收者)
消息發布者(廣播發布者)
消息中心(AMS,即Activity Manager Service)
廣播接收者通過 Binder機制在AMS注冊
廣播發送者通過 Binder 機制向AMS發送廣播
AMS根據廣播發送者要求,在已注冊列表中,尋找合適的廣播接收者(尋找依據:IntentFilter / Permission)
AMS將廣播發送到合適的廣播接收者相應的消息循環隊列中;
廣播接收者通過消息循環拿到此廣播,并回調 onReceive()
二、創建廣播接收器
廣播接收器需要實現為BroadcastReceiver類的子類,并重寫onReceive()方法來接收以Intent對象為參數的消息。
三、注冊廣播接收器
廣播接收器的注冊分為兩種:
靜態注冊
動態注冊
3.1、靜態注冊
應用程序通過在AndroidManifest.xml中注冊廣播接收器來監聽制定的廣播意圖。3.1.1 注冊
?
3.1.2、發送通知
在Activity 中新增一個發送通知的點擊事件
當點擊通知發送按鈕時,系統會自動實例化MyReceiver類,并注冊到系統中。
靜態注冊是常駐廣播,不受任何組件生命周期的影響
注意:由于自8.0以后隱式廣播不能進行靜態注冊了,所以這里通過setPackage()指定應用程序響應廣播。
3.2、動態注冊
通過registerReceiver()注冊廣播監聽?
觸發通知
在頁面關閉時記得通過unregisterReceiver()注銷廣播監聽,否則會因廣播持有Activity引用導致內存泄露。
運行結果
需要注意,在onReceive()不能執行耗時操作,onReceive()默認是在主線程中,進行耗時會阻塞主線程,如果非要執行耗時操作最好開啟一個服務在服務中進行耗時操作,不建議開啟線程來處理耗時操作,因為BroadCastReceiver的生命周期很短,可能在子線程結束前BroadCastReceiver已經退出,如果當BroadCastReceiver所在的進程結束,雖然該進程中可能有用戶啟動的新線程,但是由于該進程內沒有活動的組件,系統會在內存緊張的時候,優先結束掉該進程,這就會導致BroadCastReceiver啟動的子線程不能執行完。
四、系統廣播
上面我們一起學習了自定義廣播,下面我們一起來看一下Android 系統主要的系統廣播類型。
事件常量?? ?描述
android.intent.action.BATTERY_CHANGED?? ?持久的廣播,包含電池的充電狀態,級別和其他信息。
android.intent.action.BATTERY_LOW?? ?標識設備的低電量條件。
android.intent.action.BATTERY_OKAY?? ?標識電池在電量低之后,現在已經好了。
android.intent.action.BOOT_COMPLETED?? ?在系統完成啟動后廣播一次。
android.intent.action.BUG_REPORT?? ?顯示報告bug的活動。
android.intent.action.CALL?? ?執行呼叫數據指定的某人。
android.intent.action.CALL_BUTTON?? ?用戶點擊"呼叫"按鈕打開撥號器或者其他撥號的合適界面。
android.intent.action.DATE_CHANGED?? ?日期發生改變。
android.intent.action.REBOOT?? ?設備重啟。
總結
在BroadcastReceiver 中,廣播的類型主要分為兩大類
標注廣播
有序廣播
標準廣播
標準廣播是一種完全異步執行的廣播,在廣播發出之后,所有的BroadcastReceiver幾乎在同一時刻收到這個廣播消息,它們之間沒有先后順序,這種廣播的效率較高,并且不能被攔截。
有序廣播
有序廣播是一種完全同步的廣播,在廣播發出后只能有一個BroadcastReceiver能接收到這個廣播消息,當這個BroadcastReceiver中的邏輯執行完畢后,廣播才能繼續向下傳遞。所以這個廣播是有順序的,所以這種廣播也是可以被攔截的,如果被攔截了后面的BroadCastReceiver則不能收到廣播消息了。
?
總結
以上是生活随笔為你收集整理的快速了解安卓四大组件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件实施工程师是一个什么样的工作?他的具
- 下一篇: iOs LightBlue与cc2540