Android基础之广播

一、类型

  1. 标准广播

    完全异步执行的广播,所有广播接收器几乎都会同时接收到这条广播消息(只要含有相同的广播名)

  2. 有序广播

    同步执行的广播,广播接收器有先后顺序(可将广播截断)

二、接收系统广播(需要获取相应的系统权限

  1. 如何创建一个广播接收器?

    新建一个类,让他继承自BroadcastReceiver,并且重写父类的onReceive()方法

  2. 动态注册(在代码中注册—推荐)

    MainActivity.java

    package com.example.lenovo.broadcasttest;
    
    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.content.IntentFilter;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        private IntentFilter intentFilter;
        private NetworkChangeReceiver networkChangeReceiver;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            intentFilter=new IntentFilter();
            //广播接收器想要监听什么广播,就在这里添加相应的action
            intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
            networkChangeReceiver=new NetworkChangeReceiver();
            //调用registerReceiver()进行注册,让NetworkChangeReceiver收到android.net.conn.CONNECTIVITY_CHANGE的广播
            registerReceiver(networkChangeReceiver,intentFilter);
        }
        @Override
        protected void onDestroy(){
            super.onDestroy();
            unregisterReceiver(networkChangeReceiver);
        }
        //广播接收器
        class NetworkChangeReceiver extends BroadcastReceiver{
            @Override
            public void onReceive(Context context, Intent intent){
                //通过getSystemService()得到ConnectivityManager的实例,这是一个系统类,专门用于管理网络连接
                ConnectivityManager connectionManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo=connectionManager.getActiveNetworkInfo();//获得网络信息
                if(networkInfo!=null&&networkInfo.isAvailable()){
                    Toast.makeText(context,"network is available",Toast.LENGTH_SHORT).show();
                }else {
                    Toast.makeText(context,"network is unavailable",Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
    

    在AndroidManifest.xml中注册权限(不注册会导致崩溃)

        <!-- 申请查看网络状态的权限 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    

    效果图:
    在这里插入图片描述

在这里插入图片描述
3. 静态注册(在AndroidManifest.xml注册—不推荐)

  1. 优点:

    在程序未启动的情况下就能接收广播

  • 问题原因:
    Android8.0在AndroidManifest.xml文件中静态注册广播接收失效是由于官方对耗电量的优化,避免APP滥用广播的一种处理方式。除了少部分的广播仍支持静态注册(如开机广播),其余的都会出现失效的情况。

  • 解决方案:可以参考我的另一篇博客:

    Android8.0中将静态注册改为动态注册

三、自定义广播

  1. 本地广播
    MainActivity.java
package com.example.lenovo.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


public class MainActivity extends AppCompatActivity {
    private IntentFilter intentFilter;
    //主要就是:使用LocalBroadcastManager来对广播进行管理

    private LocalReceiver localReceiver;

    private LocalBroadcastManager localBroadcastManager;


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

        localBroadcastManager = LocalBroadcastManager.getInstance(this); // 获取实例
        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent); // 发送本地广播
            }
        });
        intentFilter = new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();//实例化接受类
        localBroadcastManager.registerReceiver(localReceiver, intentFilter); // 注册本地广播监听器(将要发送的广播名给自己)---神似动态注册
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        localBroadcastManager.unregisterReceiver(localReceiver);
    }

    class LocalReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Toast.makeText(context, "我广播我自己", Toast.LENGTH_SHORT).show();
        }
    }
}
  1. 效果图

在这里插入图片描述

  • 优势
  1. 明确知道广播只能传给自己,不会离开我们的程序,因此不必担心机密数据泄露
  2. 其他的程序也无法广播到我们程序的内部,因此不需要担心有安全漏洞的隐患
  3. 本地广播比系统全局广播更为高效
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值