編輯:Android開發教程
導讀:我們以如何搶先開機啟動為例,來說明接收無序廣播的靜態廣播接收器的接收順序
(注意,文本只是陳述結果,所以叫結果篇,之後的文章再給出源碼分析)
首先先說一下android中的廣播和廣播接收器
廣播可以分為有序、無序和sticky共三種
廣播接收器可以分為靜態和動態兩種
首先我們要明確兩個問題
1.接收無序廣播的接收器接收到廣播的順序是有序的
2.接收無序廣播的接收器也一樣可以設置優先級的
這裡主要說一下多個應用中的靜態廣播接收器(優先級都相同的情況下)接收無序廣播時的接收順序
注意:這裡主要描述結論,具體原理後續給出
注意:本文在提及的同時出現在同一設備的靜態接收器默認具有相同的優先級,這點很重要
我們以開機時候發出的廣播android.intent.action.BOOT_COMPLETED為例,這是個無序廣播
如果應用想要開啟自啟動,那麼就要監聽這個廣播,程序啟動之前,動態廣播接收器肯定是無法使用的,我相信大家對此沒有什麼疑問
如果先接收到,那麼程序就會先啟動,至於先啟動的優勢,我想那些迫不及待的人比誰都清楚
接收順序到底與什麼有關,說實話,我也不清楚,不過先別急著拍我,我也不是完全不知道……
順序與解析應用的順序是一致的,但是解析應用的順序是怎樣的呢?
首先要告訴大家的是,這和你apk的文件名沒有關系!
比如a.apk、b.apk兩個應用,結果並不能保證a能比b先接收到,或者b能比a先接收到
然後告訴大家,這和apk的文件名有關系!
沒錯,但是為什麼這麼說?
用戶安裝一個應用有這麼幾個步驟
1下載一款應用,假設下載下來的時候這個應用叫new.apk
2安裝。一般情況下,用戶會在手機中操作,點擊文件,然後系統會安裝頁面……然後大家都知道。另一種情況程序猿可能喜歡使用adb install -r new.apk
大家都知道,第三方應用會存放在/data/app目錄下
當安裝完畢之後,我們去這裡看看,發現一個嚴峻的問題,那就是,你找不到一個叫new.apk的文件!
那你會找到什麼?你會找到一個文件,他的名字是以與new.apk這個應用包名開始的,然後可能會跟著"-數字.apk",比如:com.android.test-1.apk
接收的順序與這個名字是有關的!那麼關系是怎樣的呢?
系統在開機的時候,會按著一個順序解析apk
1.首先,會解析手機中的/system/framework這個目錄,原生系統中,這下面就一個apk - framework-res.apk
當然各個廠商也會加入自己的內容,比如我的這個目錄下就有com.htc.resources.apk
2.然後受到重視的文件夾按順序分別為:
/system/app
/vendor/app
/data/app
/drm/app-private
(代碼分析在下一篇博客給出)
那麼每個文件夾下解析的順序是怎樣的呢
我們先只看/data/app,也就是用戶安裝的第三方應用的存放位置
這與下面代碼返回結果的順序是一致的
File file = new File("/data/app/"); String[] files = file.list();
也就是說,我們按順序打印這個數組,就能知道哪個接收器會先接收到這個廣播,哪個會後接收到(為什麼與這個結果一致,下篇文章分析)
(記住:本文默認說的這些接收器假設具有相同的優先級,如果優先級不同,當然是高優先級的先接收到)
現在大家可能有這麼幾個疑問:
1.String[] java.io.File.list(),這個函數的返回結果是怎樣的順序呢?
2.如何執行上面那段代碼呢?
首先回答問題1
我不知道!
我們來看看javadoc給出的說明
javadoc 寫道
There is no guarantee that the name strings in the resulting array will appear in any specific order; they are not, in particular, guaranteed to appear in alphabetical order.
說的很清楚,人家不給你任何保證
聽說在windows下執行的時候,結果會按著字母順序排列,可惜,android是linux
但是我們可以耍賴,打印一下上面結果,如果自己的應用拍在後面,就改包名,直到你能排到前面,當然這不是什麼好辦法,但我也沒有什麼更好的辦法了
Android簡明開發教程八說明了程序需要實現的功能,就可以創建Android項目了。請參見Android簡明開發教程三:第一個應 用Hello World ,創建一個新
Redirection示例涉及到三個Acitivity: RedirectEnter, RedirectMain,RedirectGetter。示例的主Activity為
AnalogClock視圖顯示了一個模擬的時鐘,其中有一個時針和一個分針。與其相對的是DigitalClock視圖 ,它可以顯示數字模擬時鐘。這兩個視圖只能顯示系統時間,
在介紹數據綁定時,我們使用了系統自帶的SimpleAdapter。Android 允許自定義Adapter ,理論上可以使用任意的View (Layout)來顯示數據。下