BroadCastReceiver 安卓广播接收者

一.广播接收者介绍

Android四大组件之一,没有可视化界面,用于不同组件和多线程之间的通信。

广播三要素:
(1)广播发送者 : 发送广播
(2)广播接收者(调频): 用于接收广播
(3)要处理的事情 :处理广播的相关信息, Intent有图对象
广播的使用场景:
(1)同一APP下多个组件之间传递数据(Activity/Fragment/Service之间传递数据)
(2)2个APP之间传递数据
技能get点:
(1)自定义广播接受者
(2)使用广播接受者进行电话拦截和短信拦截和系统电量的变化

静态注册和动态注册的区别:假如说Activity是接受者:
动态注册:
(1)广播接收者会跟Activity的生命周期的结束而结束;
(2)自由的控制注册和取消,有很大的灵活性
静态注册:
(1)广播接收者不会跟随Activity的生命周期的结束而结束,一直存在,即使应用程序关闭,也会被唤醒接受广播
(2)全局的广播

二.BroadCastReceiver实现

1.创建

通过包右键new一个Other中的BroadCast Receiver即可
在这里插入图片描述

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
       
    }
}

2.注册

(1).静态注册

在清单文件中注册广播接收者就是静态注册

<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true">

    
</receiver>
(2).动态注册

通过java代码注册广播接收者即动态注册

public class Main2Activity extends AppCompatActivity {
    private MyReceiver myReceiver;
    private Button send;


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

        initViews();
    }

    private void initViews() {
        //创建广播接收者
        myReceiver = new MyReceiver();
        send = (Button) findViewById(R.id.send);

        //创建广播过滤器
        IntentFilter intentFilter = new IntentFilter();
        //添加Action
        intentFilter.addAction("com.xzk.app3");
        //注册
        registerReceiver(myReceiver, intentFilter);

        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setAction("com.xzk.app3");
                sendBroadcast(intent);
            }
        });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
}

三.分类

从顺序上分为有序广播和无序广播(标准广播)
从作用域上分为全局广播和本地广播

1.无序广播(标准广播)

Intent intent = new Intent();
intent.setAction("com.xzk.no");
sendBroadcast(intent);

2.有序广播

Intent intent = new Intent();
intent.setAction("com.xzk.ord");
//第一个参数 intent  第二个参数  权限
sendOrderedBroadcast(intent,null);

无序广播和有序广播的区别在于使用的方法不同
无序调用sendBroadcast方法
有序调用sendOrderedBroadcast方法

有序广播的顺序在于
1.清单文件中,广播接收者的先后顺序:哪个在上,哪个先接收
2.他们的priority属性,值越大,执行顺序越靠前

priority的范围在-1000 到 1000之间

<receiver
    android:name=".MyReceiver2"
    android:enabled="true"
    android:exported="true">

    <!-- 设置优先级 -->
    <intent-filter android:priority="900">
        <action android:name="com.xzk.ord" />
    </intent-filter>
</receiver>

3.全局广播

全局广播就是可以在其它的应用程序中接收到本程序发送的广播
我们一直举的例子就是全局广播

sendBroadcast(intent);

用sendBroadcast直接发送广播

4.本地广播

本地广播就是只能在本应用程序中获得广播,而不能被其他程序获取也不能获取其他程序的广播
需要通过LocalBroadcastManager.getInstance(this)获取到本地广播的管理者
在发送广播时,用获取到的对象发送

具体实现过程

public class LocalActivity extends AppCompatActivity {
    private LocalBroadcastManager manager;
    private MyLocalReceiver myLocalReceiver;

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

       initViews();
    }

    private void initViews() {
        //获取本地广播管理者
        manager = LocalBroadcastManager.getInstance(this);
        //广播接收者
        myLocalReceiver = new MyLocalReceiver();

        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.xzk.local");

        manager.registerReceiver(myLocalReceiver,intentFilter);//注册广播
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除注册
        manager.unregisterReceiver(myLocalReceiver);
    }

    public void onClick(View view) {
        Intent intent = new Intent().setAction("com.xzk.local");
        manager.sendBroadcast(intent);//发送广播
    }
}

四.系统广播

安卓常用系统广播
https://blog.csdn.net/cc_want/article/details/82344899
(其他博主的收集)

系统在某些时候会发送相应的系统广播,下面我们就来让我们的APP接收系统广播, 接收之前,还需要为我们的APP注册广播接收器,而注册的方法又分为以下两种:动态与静态

我们只需要在广播过滤器加上系统的action 就可以实现对于某些特定的广播接收。

五.使用注意事项

不要在广播里添加过多逻辑或者进行任何耗时操作,因为在广播中是不允许开辟线程的, 当onReceiver( )方法运行较长时间(超过10秒)还没有结束的话,那么程序会报错(ANR), 广播更多的时候扮演的是一个打开其他组件的角色,比如启动Service,Notification提示, Activity等!

要开心加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值