【Android入门到项目实战-- 5.1】—— 广播(一):接收系统广播

目录

一、什么是广播?

二、广播的类型

标准广播

有序广播

三、接收系统广播

1、动态注册监听网络变化

        如何注册广播接收器?

2、静态注册实现开机启动

使用快捷方式创建广播接收器

实现开机广播


一、什么是广播?

        android广播机制就是在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。

二、广播的类型

        Android中的广播主要可以分为两种类型:标准广播和有序广播。

标准广播

完全异步执行的广播,在广播发出之后, 所有的广播接收器 几乎 同一时刻收到
广播效率高 ,但 无法被截断

 

有序广播

同步执行的广播,发出后 同一时刻只有一个广播接收器能够收到 这条消息
优先级 :一个广播接收器逻辑 执行完毕之后 广播才会 继续传递 ,或被 截断不传

 

三、接收系统广播

        Android内置了很多系统级别的广播,可以在应用程序中通过监听这些广播来得到各种系统的状态信息,如:手机开机后、电池电量发生变化时发出的广播,如果要接收到这些广播,需要使用广播接收器。

1、动态注册监听网络变化

        注册广播的方式一般有两种:代码中注册和AndroidManifest.xml中注册,前者称为动态注册,后者称为静态注册。

        如何注册广播接收器?

        新建一个类继承BroadcastReceiver,并重写父类的onReceive()方法。每当有广播到来时,onReceive()方法会自动执行,具体逻辑在此方法中实现。

        下面尝试实现一个监听网络变化的广播,新建一个BroadcastTest项目,然后修改MainActivity代码,如下:

        首先定义了一个内部类NetworkChangeReceiver继承自BroadcastReceiver,并重写onReceive()方法,当网络变化时此方法会执行,getSystemService()方法得到了 ConnectivityManager的实例,这是一个系统服务类,专门用于管理网络连接。

        onCreate()中有个android.net.conn.CONNECTIVITY_CHANGE,为什么添加这个,当网络发生变化时,系统发出的是一个值为android.net.conn.CONNECTIVITY_CHANGE的广播,这样实现了监听网络变化的功能。

        最后不要忘记,动态注册的广播接收器一定要取消注册!这里在onDestory()方法中通过unregisterReceiver()方法实现。

        另外,系统为保护用户设备的安全和隐私,必须在配置文件中声明权限才可以使用,否则直接崩溃。

        打开AndroidManifest.xml文件,加入以下代码即可:

        

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...............

    <uses-permission android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
........

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();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver,intentFilter);
    }
    protected void onDestroy(){
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);
    }

    class NetworkChangeReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
            if(networkInfo != null && networkInfo.isAvailable()){
                Toast.makeText(context,"当前有网络",Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(context,"当前没有网络",Toast.LENGTH_SHORT).show();
            }
        }
    }
}

效果如下:

 

2、静态注册实现开机启动

        动态注册的广播接收器可以自由控制注册和注销,很灵活,但是它有个缺点:必须在程序启动后才能接收到广播,因为逻辑注册在onCreate()中。

        有什么方法可以让程序在未启动时就能接收到广播?静态注册可以解决。

        下面让程序接收一条开机广播;

使用快捷方式创建广播接收器

        使用Android Studio提供的快捷方式来创建一个广播接收器:右键com.example.broadcasttest包--> New  --> Other --> Broadcast Receiver,弹出如下窗口:

        这里将广播命名为BootCompleteReceiver,Exported属性表示是否允许这个广播接收器接收本程序以外的广播,Enabled属性表示是否启用这个广播接收器。

 然后修改其代码,如下:

public class BootCompleteReceiver extends BroadcastReceiver {

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

        另外,静态广播接收器一定在AndroidManifest.xml中注册才能使用,我们是使用的快捷方式创建的广播接收器,注册这一步已经自动完成。

实现开机广播

        目前,BootCompleteReceiver还不能接收开机广播,需要修改AndroidManifest.xml文件,如下:

        <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 是声明权限;

          <intent - filter>标签里加入了相应的action。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    ....................

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
      
    ......................

        <receiver
            android:name=".BootCompleteReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

     ...................
    </application>

</manifest>

广播还没有完成,下篇文章将要讲解自定义广播和使用本地广播。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

四月天行健

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

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

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

打赏作者

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

抵扣说明:

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

余额充值