1. android 4.0為了防止一些malware(惡意軟件)不經用戶啟動就在后台運行,默認安裝的程序在用戶啟動前是完全被系統忽略的,即使程序注冊了廣播,系統也不會給該程序傳遞廣播。只有程序被用戶運行過之后,消息廣播才會生效。而且,即使程序已經運行過了,如果被用戶Force Stop(強制停止),又會回到被系統忽略的狀態。
這種情況下第三方應用只有在運行狀態下(包括Activity在后台)才能接收廣播,系統應用在任何情況下都可以接收。
2. 廣播指定了dataType,而我們注冊的intent-filter中沒有指定。
通過intent-filter隱性啟動一個Activity,Service,隱性組件的intent-filter必須如下寫:
"我是組件XXXX,我想要接收這樣的隱式事件:它的ACTION必須是 XXX,它的 category 必須是 YYYY ,它包含的data必須是ZZZZ "
如果組件不聲明IntentFilter,那么所有的隱式事件都不會發送給該組件。(注意,這並不影響向該組件發送顯式事件。)
這也就是為什么最簡單的隱性啟動Activity的intent-filter如下:
<intent-filter> <action android:name="com.android.action.NNN" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
因為默認的intent除了action之外還有一個默認的category值。
相機拍攝一張照片時會發送如下廣播:
public static void broadcastNewPicture(Context context, Uri uri){
context.sendBroadcast(new Intent(ACTION_NEW_PICTURE, uri));
context.sendBroadcast(new Intent("com.android.camera.NEW_PICTURE", uri));
}
要想接收廣播必須如下寫:
<receiver android:name="com.android.gallery3d.vivo.NewPictureBroadcastReceiver"> <intent-filter> <action android:name="android.hardware.action.NEW_PICTURE"/> <data android:mimeType="image/*"/> </intent-filter> <intent-filter> <action android:name="com.android.camera.NEW_PICTURE"/> <data android:mimeType="image/*"/> </intent-filter> </receiver>
引用:增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 淺析android事件過濾策略
