android接收不到廣播的可能原因


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事件過濾策略


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM