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事件过滤策略

posted on 2015-12-15 17:41  Matrixin  阅读(19660)  评论(0编辑  收藏  举报

导航