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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了案例分析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

以上是关于案例分析android广播接收不到原因分析的主要内容,如果未能解决你的问题,请参考以下文章

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

Android 源码分析 启动广播的发送和接收过程

Android 源码分析 启动广播的发送和接收过程

安卓开机广播接收不到,是啥原因啊?

android 广播接收不到可能是哪里出了问题

Android 7.0 ActivityManagerService 广播(Broadcast)相关流程分析