当前位置:   article > 正文

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

android 接收广播

目录

一、什么是广播?

二、广播的类型

标准广播

有序广播

三、接收系统广播

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文件,加入以下代码即可:

        

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2. ...............
  3. <uses-permission android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
  4. ........

  1. public class MainActivity extends AppCompatActivity {
  2. private IntentFilter intentFilter;
  3. private NetworkChangeReceiver networkChangeReceiver;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. intentFilter = new IntentFilter();
  9. intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
  10. networkChangeReceiver = new NetworkChangeReceiver();
  11. registerReceiver(networkChangeReceiver,intentFilter);
  12. }
  13. protected void onDestroy(){
  14. super.onDestroy();
  15. unregisterReceiver(networkChangeReceiver);
  16. }
  17. class NetworkChangeReceiver extends BroadcastReceiver{
  18. @Override
  19. public void onReceive(Context context, Intent intent) {
  20. ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  21. NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
  22. if(networkInfo != null && networkInfo.isAvailable()){
  23. Toast.makeText(context,"当前有网络",Toast.LENGTH_SHORT).show();
  24. }else{
  25. Toast.makeText(context,"当前没有网络",Toast.LENGTH_SHORT).show();
  26. }
  27. }
  28. }
  29. }

效果如下:

 

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

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

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

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

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

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

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

 然后修改其代码,如下:

  1. public class BootCompleteReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();
  5. }
  6. }

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

实现开机广播

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

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

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

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. ....................
  4. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  5. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
  6. <application
  7. ......................
  8. <receiver
  9. android:name=".BootCompleteReceiver"
  10. android:enabled="true"
  11. android:exported="true">
  12. <intent-filter>
  13. <action android:name="android.intent.action.BOOT_COMPLETED"/>
  14. </intent-filter>
  15. </receiver>
  16. ...................
  17. </application>
  18. </manifest>

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/350276
推荐阅读
相关标签
  

闽ICP备14008679号