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