【案例分析】android广播接收不到原因分析

【概述】

本人正在学习android开发,最近在练习android自定义广播的时候,发现广播怎么也接收不到。甚是奇怪,看到网上也有很多同学遇到同样的问题。今天特别总结一下,以供大家参考。当然如有纰漏错误,望各位指正。

本次讨论的是广播访问的权限问题,对于显示或者隐式的问题,不在这里赘述

【版本】

API版本为v21

【问题概述】

我先介绍一下我学习的例子。非常简单,通过一个button触发一个自定广播。

代码如下。

 1 public class MyBroadcastReceiver extends BroadcastReceiver {
 2
 3     @Override
 4     public void onReceive(Context context, Intent intent) {
 5         Log.i("TEST", "received in MyBroadcastReceiver");
 6
 7         Toast.makeText(context, "received in MyBroadcastReceiver", Toast.LENGTH_LONG).show();
 8     }
 9
10 }

界面部分就是一个button,这里就略了。

button逻辑如下:

因为安全问题,所以设置了接收权限。sendBroadcast的第二个参数为, com.example.broadcasttest.RECV_MYBC.(这个也是本次问题的原因)

PS:如果不设置访问权限,会有Exported receiver does not require permission告警。原因是第三方应用可以通过发送该广播触发该逻辑,从而产生安全风险。具体细节可以百度一下。

com.example.broadcasttest.MY_BROADCAST为自定义的广播。

public class MainActivity extends Activity {

    private Button buttonSend;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        buttonSend = (Button)findViewById(R.id.button_send);
        buttonSend.setOnClickListener(new OnClickListener() {

            //
            // 触发自定的广播,广播定义为com.example.broadcasttest.MY_BROADCAST
            // 设置接收权限为RECV_MYBC
            //
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
                sendBroadcast(intent,"com.example.broadcasttest.RECV_MYBC");
            }
        });
    }
}

AndroidManifast.xml中,也对这个receiver添加权限。

        <receiver
            android:name="com.example.broadcasttest.MyBroadcastReceiver"
            android:permission="com.example.broadcasttest.RECV_MYBC" >
            <intent-filter>
                <action android:name="com.example.broadcasttest.MY_BROADCAST" />
            </intent-filter>
        </receiver>

现象是广播接受失败。

【问题根因】

这里的权限没有申明,凡是自定义的权限是需要在AndroidManifast.xml中定义的。

【解决方案】

在AndroidManifest.xml中添加自定义权限的权限申明和权限使用

    <permission
        android:name="com.example.broadcasttest.RECV_MYBC"
        android:protectionLevel="normal" />

    <uses-permission android:name="com.example.broadcasttest.RECV_MYBC" />

注意几点:

1. 不设置访问权限是可以成功的。权限不是必须的。

2. 自定义权限的名字要带上包名,不带包名可能是有问题的。

练习代码下载:

http://download.csdn.net/detail/mimiduck/9430272

时间: 2024-10-06 05:01:26

【案例分析】android广播接收不到原因分析的相关文章

Android中app卡顿原因分析示例

在知乎回答了一个“为什么微博的app在iPhone比Android上流畅”的问题.后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里.有编程问题可以在这里交流.知乎链接. ========================================================= 我来说下我所知道的事情.我不知道iOS为什么流畅,但我知道一些Android为什么不流畅的原因. 首先,就题主所说的问题,我用iPad和小米Pad对比了一下微博滑动滚屏这件事情(2014年8月10日目前微博

android.app.Fragment$InstantiationException的原因分析

1. Fragment$InstantiationException的原因分析 在编写Fragment类的代码时候,Android Lint有时会提示如下error: Avoid not-default constructors in fragments: use a default constructor plus Fragment$setArguments(Bundle) instead From the Fragment documentation: Every fragment must

Android自动运行失败的原因分析

Android程序自动运行失败的原因是因为接收不到BOOT_COMPLETED广播.而造成接收不到BOOT_COMPLETED广播可能的原因可能有以下几个方面: (1).BOOT_COMPLETED对应的action和uses-permission没有一起添加 (2).应用安装到了sd卡内,安装在sd卡内的应用是收不到BOOT_COMPLETED广播的 (3).系统开启了Fast Boot模式,这种模式下系统启动并不会发送BOOT_COMPLETED广播 (4).应用程序安装后重来没有启动过,这

Android广播接收短信的简单实现

说明: 接受短信广播,由Intent解析出短信内容明文, intent中的短信时已pud形式传出的,即byte[][]二位数组, 需要转化出明文SmsMessage.createFromPdu(pdus[i]) 广播接收器: public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent != null

Android广播机制分析

1.1. 广播简介 Android 广播与生活中的广播概念不同,它是指系统中产生事件后的通知.Android 广播不关心接收者是否收到处理或者如何处理广播,可以说是一种单向的通知.        Android 通过 BraodcastReceiver 来监听系统发出的广播,不同的 BraodcastReceiver 通过设置不同的 fliter 来区分监听广播的类型.有些广播的监听需要相应的权限. 1.2. 注册广播 BraodcastReceiver 必须经过注册才能具有监听功能,注册的方式

Android ListView异步加载图片乱序问题,原因分析及解决方案

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/45586553 在Android所有系统自带的控件当中,ListView这个控件算是用法比较复杂的了,关键是用法复杂也就算了,它还经常会出现一些稀奇古怪的问题,让人非常头疼.比如说在ListView中加载图片,如果是同步加载图片倒还好,但是一旦使用异步加载图片那么问题就来了,这个问题我相信很多Android开发者都曾经遇到过,就是异步加载图片会出现错位乱序的情况.遇到这个问题时,不

Android广播之注册广播(包括静态广播和动态广播的注册)源码分析

Android广播按发送方式分类有三种:无序广播.有序广播(OrderedBroadcast)和粘性广播(StickyBroadcast). 静态广播的注册流程: 在系统服务启动时会添加PackageManagerService,在该类的构造方法中就会对各个应用安装目录的apk文件进行扫描解析.先看下时序图: 先看PackageManagerService类的构造方法: // Keys are String (package name), values are Package. This als

在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案

转:http://www.jianshu.com/p/89687f618837 原因分析   当我们在Android依赖库中使用switch-case语句访问资源ID时会报如下图所示的错误,报的错误是case分支后面跟的参数必须是常数,换句话说出现这个问题的原因是Android library中生成的R.java中的资源ID不是常数: 打开library中的R.java,发现确实如此,每一个资源ID都没有被声明为final: 但是当你打开你的主工程,在onClick.onItemClick等各种

Android 静态广播和动态广播接收顺序

Android广播有两个很重要的要素: 1 广播 - 用于发送广播 有序广播  -  被广播接收器接收后,可被终止,无法往下继续传达.         典型代表:短信广播 普通广播  -  发送至每一个已经注册(订阅)的广播接收器,无法被终止. 典型代表:开机启动广播 2 广播接收器 - 用于订阅广播后接收广播 静态注册广播 - 在AndroidManifest.xml中设置,程序不用启动亦可接收. 典型代表:很多开机启动的APP,都是接收开机启动广播带起服务的. 动态注册广播 - 代码中注册广