BroadcastReceiver 详解

一、

     广播机制简介

     广播主要分为两种 :  一种是标准广播,另一种是有序广播   

      1、标准广播

           标准广播是一种完全异步的的执行广播,在广播发送后所有的广播接收器几乎同一时间接收到这条广播


      2、有序广播

          有序广播顾名思义,是有顺序的,有优先级的区分,当发送广播时优先级高的广播接收器先接收到广播,并且可以截断发送的信息,不让后面的广播接收器接收到,等第一个接收完成然后,再发送优先级低的广播接收器


二、

      广播的注册方式

      广播注册一般有两种 : 动态注册、静态注册

      1、动态注册就是在我们的代码中进行注册:

     

package com.example.root.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private SimpleReceiver receiver;

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

        //过滤器
        IntentFilter filter = new IntentFilter();
        filter.addAction("simple");
        //广播
        receiver = new SimpleReceiver();
        //动态注册广播
        registerReceiver(receiver, filter);

/************************注册完成****************************/

        //给广播发送消息
        Intent intent = new Intent();
        intent.setAction("simple");
        sendBroadcast(intent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //重点:记得要注销广播
        unregisterReceiver(receiver);
    }

    class SimpleReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "*************", Toast.LENGTH_LONG).show();
        }
    }
}


   2、静态注册就是在我们的Mainfest里面进行注册

       2.1、首先是先创建我们的广播:

      

package com.example.root.myapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class SimpleReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "*************", Toast.LENGTH_LONG).show();
    }
}


   2.2、在mainfest里面进行注册

    

   现在已经注册完成!

   2.3、下面就给我们的广播发送信息吧

      

//给广播发送消息
        Intent intent = new Intent();
        intent.setAction("mainfestReceiver");
        sendBroadcast(intent);
  

   2.4、OK接收成功!

下面给大家说一下action这个是根据自己的需求来进行监听的,举个栗子:你如果需要监听系统网络的话  就需要修改action :  android.net.conn.CONNECTIVITY_CHANGE 注意要加网络权限


三、

    1、 给大家再说一个广播的一些属性:

         Exported : 表示你 是否允许这个广播接收本程序以外的广播

         Enable : 表示是否启用这个广播

         Priority : 给广播设置优先级

    2、广播是一种可以跨进程的通信方式,在前面的学习中都可以看出来,所以我们应用程序内部发出的广播也是可以被其他程序接收,为了证实大家可以修改一下工程的包名以及Toast吐出来的信息,然后再次安装到手机上 现在就在我们的手机上看到两次不同的信息

   

    3、前面给大家提到有序广播我们就把前面发送的方式修改一下   sendBroadcast(intent)修改为sendOrderedBroadcast(intent,null);  但是这样的话大家会发现没有什么区别,不要忘了这个时候的广播接收器是有先后顺序的,大家现在就可以用到我们说到的属性 Priority 设置优先级 当然我们之前也说到截断这个时 我们就把优先级设置为100,保证一定个可以接收到广播

    4、截断我们可以在onReceive里面调用abortBroadcast进行广播的截断 ,这个时候优先级低的就会接收不到广播信息

 *****************a:发发牢骚******a:好下面给大家介绍一下本地广播************************s :还有,我都方啦!!打他!!!!!*******************************************************

四、

      使用本地广播

      介绍 : 为什么要用本地广播大家想一下如果所有的广播都像前面的进程只要动作一样是不是都要乱了  比如小广告,是不是很恶心.....

      其实本地广播非常简单当然其他的广播是接收不到的 直接上代码:

package com.example.root.myapplications;

import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    private SimpleReceiver receiver;
    private LocalBroadcastManager localBroadcastinStance;

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

        //本地广播管理器
        localBroadcastinStance = LocalBroadcastManager.getInstance(getApplicationContext());
        //过滤器
        IntentFilter filter = new IntentFilter();
        filter.addAction("simple");
        //广播
        receiver = new SimpleReceiver();
        //动态注册广播
        localBroadcastinStance.registerReceiver(receiver, filter);

/************************注册完成****************************/

        //给广播发送消息
        Intent intent = new Intent();
        intent.setAction("mainfestReceiver");
        localBroadcastinStance.sendBroadcast(intent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //重点:记得要注销广播
        localBroadcastinStance.unregisterReceiver(receiver);
    }

}


author :  如果大家有不同意见的希望给出建议,不懂的也可以提问我会在第一时间给出自己的想法和答案,虽然没有大神们写的那么高大尚,但也希望自己也能够共享自己的微薄之力!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值