zoukankan      html  css  js  c++  java
  • 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事件过滤策略

  • 相关阅读:
    错误记录(一):VSCode
    【洛谷P4770】你的名字
    【洛谷P3177】树上染色
    【洛谷P3704】数字表格
    【CF762F】Tree nesting
    【洛谷P5064】等这场战争结束之后
    【洛谷P3346】诸神眷顾的幻想乡
    【BZOJ#2119】股市的预测
    UiPath数据抓取Data Scraping的介绍和使用
    UiPath录制器的介绍和使用
  • 原文地址:https://www.cnblogs.com/fordreamxin/p/5048933.html
Copyright © 2011-2022 走看看