Android 中的广播机制

一、Android广播概念:

在Android中,有一些操作完成以后,会发送广播,Android系统内部产生这些事件后广播这些事件,至于广播接收对象是否关心这些事件,以及它们如何处理这些事件,都由广播接收对象自己决定。

二、发送全局广播:

  • 发送广播有两种类型:
    • 标准广播
    • 有序广播

1.标准广播:

完全异步执行的广播,发出广播后,所有的广播接收器几乎会在同一时刻收到这条广播通知。

//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    	//第一步:将需要广播的消息封装到Intent中
        Intent intent = new Intent();
        intent.putExtra("name","张三");
        //第二步:自定义广播频段,表示该条广播会在那个频段下发出
        intent.setAction("my.broadcast.key");
        //第三步:调用Context的sendBroadcast()方法将广播发送出去;
        sendBroadcast(intent);
    }
});

2.有序广播:

同步执行的一种广播,同一时刻只有一个广播接收器能收到,这个广播接受者的逻辑执行完后,才会传递到下一广播接受者。
在这里插入图片描述

//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //第一步:将需要广播的消息封装到Intent中
        Intent intent = new Intent();
        intent.putExtra("name","张三");
        //第二步:自定义广播频段,表示该条广播会在那个频段下发出
        intent.setAction("my.broadcast.key");
        //第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
        //第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
        sendOrderedBroadcast(intent,null);
    }
});
/*
1.优先接收到广播的Broadcastreceiver广播接收者可以通过setResultExtras(Bundle)方法将一个Bundle对象设置为结果集对象,传给下一个接收者。
2.下一个接收者通过getResultExtras()可以获取上一个接收者存入的数据
3.中断广播,拦截一条广播不往下发送abortBroadcast()
*/

三、接收全局广播:

为了监听这些广播事件,Android提供了一个BroadcastReceiver全局监听器组件,该组件可以监听来自系统或应用程序的广播。

1.运行机制:

当系统或其他应用程序发送广播时,所有已经注册的 BroadcastReceiver 的应用程序就会检查注册时的IntentFilter里的Action是否与发送广播时的Intent的Action相匹配,若匹配则会调用BroadcastReceiver的onReceive()方法进行处理,所以主要工作是对BroadcastReceiver里的onReceive()方法的实现。

2.步骤:

第一步:创建一个类继承BroadcastReceiver,实现onReceive()方法

package com.example.myapplication;

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

public class MyReceiver extends BroadcastReceiver {
    //检测到广播后会自动回调onReceive方法
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "检测到广播", Toast.LENGTH_LONG).show();
    }
}

第二步:注册BroadcastReceiver

  • 动态注册:
//1.构建IntentFilter标签,设置其Action属性
IntentFilter filter = new IntentFilter();
//2.Action属性指定接收来自哪个频段的广播
filter.addAction("my.broadcast.key");
//3.将IntentFilter装入广播接收器中
MyReceiver receiver = new MyReceiver();
//4.注册广播接收器
registerReceiver(receiver, filter);
  • 静态注册:
<!--广播接收器的全限定类名-->
<receiver android:name="com.example.myapplication.MyReceiver"
    android:exported="true">
    <!--过滤机制-->
    <intent-filter>
        <action android:name="my.broadcast.key"/>
    </intent-filter>
</receiver>

3.BroadcastReceiver生命周期:

每次广播事件发生后,系统就会创建对应的BroadcastReceiver实例对象,并自动触发它的onReceive()方法,onReceive()方法执行完后,BroadcastReceiver的实例对象就会被销毁。

四、本地广播:

前面接触的广播都是全局广播,这同样意味着我们APP发出的广播,其他APP都会接收到,但是部分广播我们不希望其他APP捕获。
Android中给我们提供了本地广播 LocalBroadcastManager 的机制,使用该机制发出的广播只会在APP内部传播,而且广播接收者也只能收到本应用发出的广播。

1.实现只在本应用内发送广播:

发送广播的具体步骤同(二)

第一步:获取LocalBroadcastManager的实例对象

LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;

第二步:调用LocalBroadcastManager对象的sendBroadcast()发送广播

localBroadcastManager.sendBroadcast(intent);

2.实现只接收本应用内的广播:

接收广播的具体步骤同(三)

第一步:获取LocalBroadcastManager的实例对象

LocalBroadcastManager localBManager = LocalBroadcastManager.getInstance( this ) ;

第二步:通过LocalBroadcastManager对象的registerReceiver()注册广播

localBManager. registerReceiver(localReceiver, intentFilter);

五、案例:广播的接收和发送

注:其实这部分内容我也没有太深入的理解,主要是根据这个简单的案例写的文章。

MyReceiver.java:

package com.example.myapplication;

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

public class MyReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "检测到广播,广播内存有数据:"+intent.getStringExtra("name"), Toast.LENGTH_LONG).show();
    }
}

MainActivity.java:

package com.example.myapplication;

import android.content.IntentFilter;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = findViewById(R.id.btn);
        //点击按钮发送广播
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //第一步:将需要广播的消息封装到Intent中
                Intent intent = new Intent();
                intent.putExtra("name","张三");
                //第二步:自定义广播频段,表示该条广播会在那个频段下发出
                intent.setAction("my.broadcast.key");
                //第三步:调用Context的sendOrderedBroadcast()方法将广播发送出去;
                //第二个参数是权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。
                sendBroadcast(intent);
            }
        });
        //构建IntentFilter标签,设置其Action属性
        IntentFilter filter = new IntentFilter();
        //Action属性指定接收来自哪个频段的广播
        filter.addAction("my.broadcast.key");
        //将IntentFilter装入广播接收器中
        MyReceiver receiver = new MyReceiver();
        //注册广播接收器
        registerReceiver(receiver, filter);
    }
}

效果:

点击按钮发送全局标准广播,并被本应用捕获。
在这里插入图片描述

六、案例:本地广播

MyLocalBroadcastReceiver.java:

package com.example.t.androidproject.yati;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class MyLocalBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("clh", "onReceive: 收到了本地广播");
    }
}

LocalBroadCastActivity.java:

package com.example.t.androidproject.yati;

import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

public class LocalBroadCastActivity extends AppCompatActivity {
    private MyLocalBroadcastReceiver mlbr = new MyLocalBroadcastReceiver();
    LocalBroadcastManager lbm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //实例化
        lbm = LocalBroadcastManager.getInstance(this);
        //注册广播接收器
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("local_broad_cast");
        lbm.registerReceiver(mlbr, intentFilter);
        Button btn = findViewById(R.id.btn_local);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("local_broad_cast");
                lbm.sendBroadcast(intent);
            }
        });
    }
    //解除注册
    @Override
    protected void onDestroy() {
        super.onDestroy();
        lbm.unregisterReceiver(mlbr);
    }
}

效果:

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姓蔡小朋友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值