cpu是外部設(shè)備嗎_Service: 監(jiān)聽外部存儲(chǔ)設(shè)備
本文關(guān)鍵詞:外部設(shè)備,由筆耕文化傳播整理發(fā)布。
博客聲明:
1. 使用 android2.1 源碼說明問題
2. 使用真機(jī),操作系統(tǒng)是 android-2.1
3. 分享一下學(xué)習(xí)方法,不是為了測試而測試,請(qǐng)大家舉一反三
結(jié)合 Service 與 Broadcast 監(jiān)聽外部存儲(chǔ)設(shè)備的狀態(tài),通過測試主要想知道在我們操作外部存儲(chǔ)設(shè)備時(shí)候發(fā)生了哪些事情、以及 Intent 幾個(gè) Action 到底是何意?
測試代碼見 附錄,至于如何啟動(dòng)這個(gè) Service,隨您意!
主要的 Action
注冊(cè)這 13 個(gè) action,然后運(yùn)行 app ,點(diǎn)擊 back 服務(wù)退至后臺(tái)。
now,ready!來操作 sdcard。
1. 直接拔掉 sdcard
2. 再次將 sdcard 插入卡槽
先大概 1-3 秒的 media checking,然后才是 mounted -- scanner started -- scanner finished
3. 在通知欄卸載 sdcard
緊接著,從卡槽拔出 sdcard(必須拔出,,才會(huì)接收到下面的 action)
可以看出,這種情況屬于正常卸載 sdcard,不是強(qiáng)制拔出。不同于 1.
這個(gè)時(shí)候,你將 sdcard 插入卡槽,發(fā)生的情況與 2 一致。
4. 在通知欄選擇 "計(jì)算機(jī)與 sd 卡之間復(fù)制文件",即共享
在彈出的對(duì)話框選擇 "裝載"
然后,我們?cè)俅卧谕ㄖ獧谶x擇 "關(guān)閉 usb 存儲(chǔ)設(shè)備",接下來發(fā)生的與 2 一致。
從這幾個(gè)測試,我們可以發(fā)現(xiàn)幾個(gè)規(guī)律:
1. 不管以何種方式卸載(正常卸載拔出、正常卸載不拔出 sd 卡、直接拔出 sd 卡)
系統(tǒng)都會(huì)發(fā)出下面的 action 廣播
ACTION_MEDIA_EJECT
ACTION_MEDIA_UNMOUNTED
2. 不管以何種方式安裝 sd 卡,系統(tǒng)都會(huì)發(fā)出下面的 action 廣播
3. ACTION_MEDIA_REMOVED 與 ACTION_MEDIA_UNMOUNTED 區(qū)別
ACTION_MEDIA_REMOVED
表示 sdcard 已經(jīng)從卡槽移除。
ACTION_MEDIA_UNMOUNTED
只可以說明 sd 卡沒有 mount 在文件系統(tǒng)上面,不可以說明其已經(jīng)從卡槽移除。
從測試 4 就可以看出這個(gè)端倪。
4. ACTION_MEDIA_REMOVED 與 ACTION_MEDIA_BAD_REMOVAL 區(qū)別
ACTION_MEDIA_BAD_REMOVAL
只有在直接拔出 sd 卡時(shí),系統(tǒng)才會(huì)發(fā)送這樣的 action 廣播。
ACTION_MEDIA_REMOVED
不管何種方式從卡槽拔出 sd 卡時(shí),系統(tǒng)就會(huì)發(fā)送這樣的 action 廣播。
5. 選擇通過 usb 共享,系統(tǒng)一定會(huì)發(fā)出下面的 action 廣播
ACTION_MEDIA_SHARED
ok,明白上面的道理(你基于的開發(fā)平臺(tái)是否是這樣,你還需要測試,我這里只是拋磚引玉),可以在接收到這些廣播的時(shí)候,根據(jù) action 寫自己的邏輯代碼了。如:
但是這里提醒一下:
接收到 ACTION_MEDIA_EJECT 廣播之后,sd 卡還是可以讀寫的,
直到接收到 ACTION_MEDIA_REMOVED、ACTION_MEDIA_UNMOUNTED等廣播之后,sd 卡才不可以讀寫。
可以借助 Music 源碼 MediaPlaybackService.java 看看:
到這個(gè)時(shí)候,我們應(yīng)該搞明白是系統(tǒng)哪個(gè)類發(fā)出這樣的廣播?有沒有新的發(fā)現(xiàn)?
android2.1/frameworks/base/services/java/com/android/server/MountService.java
與其相關(guān)的類是
android2.1/frameworks/base/services/java/com/android/server/MountListener.java
繼續(xù)跟蹤 MountService.java , 我們會(huì)發(fā)現(xiàn)實(shí)例化 intent:
intent
= new Intent(Intent.ACTION_MEDIA_SHARED, Uri.parse("file://" + path));
都包含一個(gè) scheme 為 file 的 path,那麼這個(gè) path 是什么呢?
可以在 onReceive 方法里面得到這個(gè)值
final
String path = intent.getData().getPath()
其實(shí),就是 "/sdcard" (即 sd 卡路徑)。
這個(gè)信息很有用。!
比如你的手機(jī)可以外括除了 sd 卡的其它外部設(shè)備(如 u 盤、map 卡)
那麼這個(gè)返回的路徑就不一樣,可以根據(jù)返回的路徑判斷你當(dāng)前操作的是哪個(gè)設(shè)備了!
耶耶,酷比嘞!
在 MountService.java 里面還有一個(gè)與眾不同的地方:
intent.putExtra("read-only",
readOnly)
其中 readOnly 是一個(gè) boolean 值,在 onReceive 里面 只有 action 是 ACTION_MEDIA_MOUNTED,接收到該值是 false.
------------- 附錄
PlayerService.java
本文關(guān)鍵詞:外部設(shè)備,由筆耕文化傳播整理發(fā)布。
本文編號(hào):211450
本文鏈接:http://sikaile.net/wenshubaike/xxkj/211450.html