【案例分析】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

转载于:https://www.cnblogs.com/idealcat/p/5186909.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值