GVKun编程网logo

android – BroadcastReceiver没有接收广播(android接收不到广播)

5

在这篇文章中,我们将带领您了解android–BroadcastReceiver没有接收广播的全貌,包括android接收不到广播的相关情况。同时,我们还将为您介绍有关AndroidBroadcast

在这篇文章中,我们将带领您了解android – BroadcastReceiver没有接收广播的全貌,包括android接收不到广播的相关情况。同时,我们还将为您介绍有关Android Broadcast 和 BroadcastReceiver的权限限制方式、Android BroadcastReceiver、Android BroadcastReceiver 接收收到短信的广播、Android BroadcastReceiver 简介的知识,以帮助您更好地理解这个主题。

本文目录一览:

android – BroadcastReceiver没有接收广播(android接收不到广播)

android – BroadcastReceiver没有接收广播(android接收不到广播)

我正在尝试使用以下代码扩展活动来广播Toast消息.但是广播没有被另一个活动收到,烤面包没有显示.有人能解决我的错误吗?主要活动是Sendbroadcast. java
import android.app.Activity;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class Sendbroadcast extends Activity {

    public static String broADCAST_ACTION =
                             "com.unitedcoders.android.broadcasttest.SHOWTOAST";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void sendbroadcast(View v) {
        Intent broadcast = new Intent();
        broadcast.setAction(broADCAST_ACTION);
        sendbroadcast(broadcast);
    }
}

Toast display Activity是Toastdisplay.java

import android.app.Activity;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.widget.Toast;

public class Toastdisplay extends Activity {

    private broadcastReceiver receiver = new broadcastReceiver() {

        @Override
        public void onReceive(Context context,Intent intent) {
            Toast.makeText(getApplicationContext(),"received",Toast.LENGTH_SHORT).show();
        }
    };

    @Override
    protected void onResume() {
        IntentFilter filter = new IntentFilter();
        filter.addAction(Sendbroadcast.broADCAST_ACTION);
        registerReceiver(receiver,filter);
        super.onResume();
    }

    @Override
    protected void onPause() {
        unregisterReceiver(receiver);
        super.onPause();
    }
}

和manifest.xml如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.broad"
    android:versionCode="1"
    android:versionName="1.0" >
    <uses-sdk android:minSdkVersion="3" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".Sendbroadcast"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".ToastReceiver" >
            <intent-filter>
                <action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

解决方法

可以有两种类型的broacast:静态和动态.静态是清单文件中声明的那些.动态可以在运行时声明.您将这两种类型的广播组合在一个广播中.

要声明一个简单的动态广播,您可以使用以下代码(基于您的代码).当显示活动时,它将只显示Toast消息.

import android.app.Activity;
import android.content.broadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

public class broadcastTestActivity extends Activity {

    public static String broADCAST_ACTION =     
                            "com.unitedcoders.android.broadcasttest.SHOWTOAST";
    broadcastReceiver br = new broadcastReceiver() {

        @Override
        public void onReceive(Context context,Intent intent) {
            Log.w("Check","Inside On Receiver");
            Toast.makeText(getApplicationContext(),Toast.LENGTH_SHORT).show();
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        IntentFilter filter = new IntentFilter();
        filter.addAction(broADCAST_ACTION);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        registerReceiver(br,filter);
    }

    @Override
    protected void onResume() {
        super.onResume();
        sendbroadcast();
    }

    @Override
    protected void onPause() {
        super.onPause();
        unregisterReceiver(br);
    }

    public void sendbroadcast() {
        Intent broadcast = new Intent();
        broadcast.setAction(broADCAST_ACTION);
        broadcast.addCategory(Intent.CATEGORY_DEFAULT);
        sendbroadcast(broadcast);
    }
}

所以现在不用显示吐司就可以调用你的新活动.以下操作取决于您的需求(您想要做什么).

Android Broadcast 和 BroadcastReceiver的权限限制方式

Android Broadcast 和 BroadcastReceiver的权限限制方式

在Android应用开发中,有时会遇到以下两种情况,

1. 一些敏感的广播并不想让第三方的应用收到 ;

2. 要限制自己的Receiver接收某广播来源,避免被恶意的同样的ACTION的广播所干扰。

在这些场景下就需要用到广播的权限限制。

第一种场景: 谁有权收我的广播?

在这种情况下,可以在自己应用发广播时添加参数声明Receiver所需的权限。

首先,在Androidmanifest.xml中定义新的权限RECV_XXX,例如:

<permission android:name = "com.android.permission.RECV_XXX"/>

然后,在Sender app发送广播时将此权限作为参数传入,如下:

sendBroadcast("com.android.XXX_ACTION", "com.android.permission.RECV_XXX");

这样做之后就使得只有具有RECV_XXX权限的Receiver才能接收此广播要接收该广播,在Receiver应用的AndroidManifest.xml中要添加对应的RECV_XXX权限。

例如:

<uses-permission android:name="com.android.permission.RECV_XXX"></uses-permission>

第二种场景: 谁有权给我发广播?

在这种情况下,需要在Receiver app的<receiver> tag中声明一下Sender app应该具有的权限。

首先同上,在AndroidManifest.xml中定义新的权限SEND_XXX,例如:

<permission android:name="com.android.SEND_XXX"/>

然后,在Receiver app的Androidmanifest.xml中的<receiver>tag里添加权限SEND_XXX的声明,如下:

<receiver android:name=".XXXReceiver" 
     android:permission="com.android.permission.SEND_XXX"> 
 <intent-filter>
  <action android:name="com.android.XXX_ACTION" /> 
 </intent-filter>
</receiver>

这样一来,该Receiver便只能接收来自具有该SEND_XXX权限的应用发出的广播。

要发送这种广播,需要在Sender app的AndroidManifest.xml中也声明使用该权限即可,如下:

<uses-permission android:name="com.android.permission.SEND_XXX"></uses-permission>

如此,可以用来对广播的来源与去处进行简单的控制。

同样,对Activity 和 ContentProvider的访问权限控制也类似。

补充知识:Android发送权限受限的广播,指定接受方!

本文实践代码是在Android7.1上的系统级源码上验证通过的。

1.首先是发送方:

在frameworks\base\core\res\AndroidManifest.xml中定义权限

<protected-broadcast android:name="intent.action.LOW_MEMORY" />

<uses-permission android:name="com.softmanager.permission.send.SOFTMANAGER"/>
 
  <permission android:name="com.softmanager.permission.send.SOFTMANAGER"
 android:protectionLevel="signature|privileged"/>

在代码需求的地方发出广播

Intent systemMgrIntent = new Intent();
systemMgrIntent.setAction("intent.action.LOW_MEMORY");
systemMgrIntent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
context.sendOrderedBroadcast(systemMgrIntent, "com.softmanager.permission.receiver.SOFTMANAGER");

2.然后是接受方:

在项目的

AndroidManifest.xml中声明权限

<uses-permission android:name="com.softmanager.permission.receiver.SOFTMANAGER" />
<permission
  android:name="com.gionee.softmanager.permission.receiver.SOFTMANAGER"
  android:protectionLevel="normal" />
 
android:permission="com.softmanager.permission.send.SOFTMANAGER"

在Receiver.java中要添加权限

<receiver android:name=".Receiver"
      android:permission="com.softmanager.permission.send.SOFTMANAGER"
      android:exported="true">
      <intent-filter>
        <action android:name="intent.action.LOW_MEMORY"/>
      </intent-filter>
    </receiver>

最后在onReceiver()中就能接受到广播了

以上这篇Android Broadcast 和 BroadcastReceiver的权限限制方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

您可能感兴趣的文章:
  • Kotlin语言使用BroadcastReceiver示例介绍
  • Android四大组件之broadcast广播详解
  • Android 广播接收器BroadcastReceiver详解
  • Android四大组件之广播BroadcastReceiver详解
  • Android Broadcast原理分析之registerReceiver详解
  • Android BroadcastReceiver广播简单使用
  • Android中BroadcastReceiver案例讲解
  • Kotlin四大组件中的broadcast广播

Android BroadcastReceiver

Android BroadcastReceiver

1、Android 监听屏幕解锁事件

http://blog.csdn.net/gf771115/article/details/7991892

2、Android利用系统广播---监听应用程序安装和卸载

http://blog.csdn.net/wangjia55/article/details/8470611

3、使用Service和BroadcastReceiver实时监听网络状态

http://gundumw100.iteye.com/blog/1732865


Android BroadcastReceiver 接收收到短信的广播

Android BroadcastReceiver 接收收到短信的广播

一、知识介绍

  1、broadcastReceiver是广播接受者,四大组件之一。

  2、Android中内置了很多系统级别的广播,可以在应用程序中得到各种系统的状态信息。

  3、使用场景:

      ①当手机没有电时,会告知用户“电量低”的广播信息。可以做到正在使用的app就会接收到这个广播消息,如果是游戏可能是提醒保存数据,如果是正在使用的工作软件,可能提醒接上电源。

      【提示】对于某某程序来说,可以选择接收这一消息也可以选择不接收这个消息。

      ②手机的storage不够了,提示你清理空间,否则应用程序将变慢或者无法使用。

      ③手机一开机,某某程序就自动运行,QQ、微信都是开机自启。

  4、一个程序发出广播信息,一个程序接收广播信息,所以至少需要2个程序才能完成一发一收。发的一方,叫广播发送方;收的一方,叫广播接收者。

  5、广播接受者需要进行注册。动态注册,静态注册(在AndroidManiFest文件中)

  

二、项目实践

【步骤】

  ①定义广播接受者

  ②进行注册,添加过滤器 intent-filter,接收特定的广播

  ③重写onReceiver方法,如果执行,代表已经接收到广播

  ④定义收到信息广播接收者,属于系统广播,则需要申请权限(静态,动态)

【项目结构】

    

【提示】创建Receiver可以通过以下方式

    此方法会自动在AndroidManifest中进行注册receiver,但是需要接收固定的广播,仍需添加intent-filter

    

    

 【AndroidManifest】  

1         <receiver
2             android:name=".receiver.MsgReceiver"
3             android:enabled="true"
4             android:exported="true">
5             intent-filter6                 action ="android.provider.Telephony.SMS_RECEIVED"></action7                 <!--接收收到信息的广播-->
8             </9         receiver>

【MsgReceiver】

  重写onReceiver方法,添加Toast

 1 import android.content.broadcastReceiver;
 2  android.content.Context;
 3  android.content.Intent;
 4  android.widget.Toast;
 5 
 6 public class MsgReceiver extends broadcastReceiver {
 7 
 8     @Override
 9     void onReceive(Context context,Intent intent) {
10         // Todo: This method is called when the broadcastReceiver is receiving
11          an Intent broadcast.
12         Toast.makeText(context,"收到信息",Toast.LENGTH_SHORT).show();
13         添加Toast便于观察
14     }
15 }

 

【添加权限】

  ①静态权限:【AndroidManifest】   

1    uses-permission ="android.permission.READ_SMS"uses-permission2     ="android.permission.RECEIVE_SMS">

  ②动态权限【MainActivity】

 android.Manifest;
 android.content.pm.PackageManager;
 android.support.v4.app.ActivityCompat;
 android.support.v7.app.AppCompatActivity;
 android.os.Bundle;

class MainActivity  AppCompatActivity {

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

        if (ActivityCompat.checkSelfPermission(MainActivity.this
                ActivityCompat.checkSelfPermission(MainActivity.PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(MainActivity.new String[]{Manifest.permission.READ_SMS,Manifest.permission.RECEIVE_SMS},1);
        }动态申请权限
    }
}

 

【测试】

  ①操作

    

 

  ②效果

     

 

 【小结】

   ①这里是接收系统广播,也可以自己定义广播。以及可以添加很多功能,接收到广播进行特定的操作。

   ②广播必须添加过滤器,对特定的广播进行接收

   ③如果是接收系统广播要进行权限的申请,5.0之后一定要进行动态权限申请才可以

 

 

    

 

总结

以上是小编为你收集整理的Android BroadcastReceiver 接收收到短信的广播全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Android BroadcastReceiver 简介

Android BroadcastReceiver 简介

Android BroadcastReceiver 简介
在 Android 中使用 Activity, Service, Broadcast, BroadcastReceiver 
   活动 (Activity) - 用于表现功能  
   服务 (Service) - 相当于后台运行的 Activity 
   广播 (Broadcast) - 用于发送广播  
   广播接收器 (BroadcastReceiver) - 用于接收广播 
   Intent - 用于连接以上各个组件,并在其间传递消息 

BroadcastReceiver 
    在 Android 中,Broadcast 是一种广泛运用的在应用程序之间传输信息的机制。而 BroadcastReceiver 是对发送出来的 Broadcast 进行过滤接受并响应的一类组件。下面将详细的阐述如何发送 Broadcast 和使用 BroadcastReceiver 过 

滤接收的过程: 
    首先在需要发送信息的地方,把要发送的信息和用于过滤的信息 (如 Action、Category) 装入一个 Intent 对象,然后通过调用 Context.sendBroadcast ()、sendOrderBroadcast () 或 sendStickyBroadcast () 方法,把 Intent 对象以广播方式发送出去。 
    当 Intent 发送以后,所有已经注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若 匹配则就会调用 BroadcastReceiver 的 onReceive () 方法。所以当我们定义一个 BroadcastReceiver 的时候,都需要 实现 onReceive () 方法。 

注册 BroadcastReceiver 有两种方式: 
    一种方式是,静态的在 AndroidManifest.xml 中用 <receiver> 标签生命注册,并在标签内用 < intent- filter > 标签设置过滤器。 

    另一种方式是,动态的在代码中先定义并设置好一个 IntentFilter 对象,然后在需要注册的地方调 Context.registerReceiver () 方法,如果取消时就调用 Context.unregisterReceiver () 方法。如果用动 态方式注册的 BroadcastReceiver 的 Context 对象被销毁时,BroadcastReceiver 也就自动取消注册了。 

    另外,若在使用 sendBroadcast () 的方法是指定了接收权限,则只有在 AndroidManifest.xml 中用 < uses- permission> 标签声明了拥有此权限的 BroascastReceiver 才会有可能接收到发送来的 Broadcast。 

    同样,若在注册 BroadcastReceiver 时指定了可接收的 Broadcast 的权限,则只有在包内的 AndroidManifest.xml 中 用 <uses-permission> 标签声明了,拥有此权限的 Context 对象所发送的 Broadcast 才能被这个 BroadcastReceiver 所接收。 

动态注册: 
    IntentFilter intentFilter = new IntentFilter(); 
    intentFilter.addAction (String);-- 为 BroadcastReceiver 指定 action,使之用于接收同 action 的广播 registerReceiver (BroadcastReceiver,intentFilter); 
    一般:在 onStart 中注册,onStop 中取消 unregisterReceiver 

发送广播消息:extends Service 
    指定广播目标 Action:Intent Intent = new Intent (action-String) 
    -- 指定了此 action 的 receiver 会接收此广播 
    需传递参数 (可选) putExtra (); 
    发送:sendBroadcast (Intent); 

因此如果我想要自定义一个监听程序退出时的消息:

在主 activity 中的 destory 方法中

 @Override

      protected void onDestroy() {

             super.onDestroy();

            // 新建一个自定义的 intent

            Intent Intent = new Intent( "com.skymobile.empresses.EXIT");

            sendBroadcast(Intent);

      }

在服务类中的 onCreate 方法中绑定指定的监听消息

private MsgReceiver msgReceiver ;

      @Override

      public void onCreate() {

            log( "onCreate" );

             se = Executors. newSingleThreadScheduledExecutor();

             sfMap = new SparseArray<ScheduledFuture<?>>();

             manager = (NotificationManager) getSystemService( Context.NOTIFICATION_SERVICE );

             // 点击顶部状态栏的消息后跳转到游戏页面

             pending = PendingIntent. getActivitythis, 0, new Intent( this, MainActivity. class ), 0 );

             // 动态注册广播接收器,指定监听哪些消息

             msgReceiver = new MsgReceiver();

            IntentFilter intentFilter = new IntentFilter();

            intentFilter.addAction( "com.skymobile.empresses.RECEIVER" );

            intentFilter.addAction( "com.skymobile.empresses.EXIT" );

            registerReceiver( msgReceiver, intentFilter ); 

             // onCreate

             super.onCreate();

      }

在服务类中的内部类,这样在相应消息发出时将被该接收器捕捉到并执行相应逻辑

/**

       * 广播接收器

       */

      class MsgReceiver extends BroadcastReceiver {

             @Override

             public void onReceive(Context context, Intent intent) {                 

                   try {

                        allNtfInit();

                  } catch (Exception e) {

                        e.printStackTrace();

                  }

            }

      }

关于android – BroadcastReceiver没有接收广播android接收不到广播的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Android Broadcast 和 BroadcastReceiver的权限限制方式、Android BroadcastReceiver、Android BroadcastReceiver 接收收到短信的广播、Android BroadcastReceiver 简介等相关内容,可以在本站寻找。

本文标签: