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

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

【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;@Overrideprotected 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{@Overridepublic 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 {@Overridepublic 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......................<receiverandroid:name=".BootCompleteReceiver"android:enabled="true"android:exported="true"><intent-filter><action android:name="android.intent.action.BOOT_COMPLETED"/></intent-filter></receiver>...................</application></manifest>

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

特殊符号