广播机制一(广播接收器)

  • 广播有两种,一种是无序广播,一种是有序广播。
    • 无序广播:也称为标准广播,是一种完全异步的广播,在广播发出后,几乎同一时间,所有的广播接收器都可以接受到这广播。他没有先后顺序,这也就是说,他的效率会比较高,而且无法被截断。
    • 有序广播:是一种同步执行的广播,在广播发出后,同一时间,只有一个广播接收器能够接受到该广播,当这个广播接收器中的逻辑执行完毕后,广播才可以继续传递。广播接收器是有优先级的,优先级的高低,决定了接受广播的顺序。并且,在高优先级可以截断广播,使低优先级的接收器无法接受广播。
  • 广播有注册的方式有两种:
    • 静态注册:在清单文件中注册,和动态注册相比,可以让广播接收器在程序未启动的状态也可以接受广播。
      • 清单文件:
        <?xml version="1.0" encoding="utf-8"?>
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="com.example.mac.broadcast_demo">

            <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
            <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />S
            <application
                android:allowBackup="true"
                android:icon="@mipmap/ic_launcher"
                android:label="@string/app_name"
                android:supportsRtl="true"
                android:theme="@style/AppTheme">
                <activity android:name=".MainActivity">
                    <intent-filter>
                        <action android:name="android.intent.action.MAIN" />

                        <category android:name="android.intent.category.LAUNCHER" />
                    </intent-filter>
                </activity>
                <!--静态注册服务-->
                <receiver android:name=".BootCompleteReceiver">
                    <intent-filter>
                        <action android:name="android.intent.action.BOOT_COMPLETED" />
                    </intent-filter>
                </receiver>
            </application>

        </manifest>
      • 我们需要新建一个类来继承我们的广播类BroadcastReceiver,然后在onReceive()中写逻辑代码就可以了。
        package com.example.mac.broadcast_demo;

        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.util.Log;

        /**
         * Created by mac on 16/8/13.
         */
        public class BootCompleteReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context contextIntent intent) {
                Log.d("zlx","系统启动了");
            }
        }
      • 这样就完成了广播的静态注册。
    • 动态注册:在代码中注册,广播接收器可以自由的进行注册和注销,具有很高的灵活性,但是必须是程序启动后才可以注册广播。因为注册的代码时是写在onCreate()方法中的。
      • 新建一个类,让他继承父类BroadcastReceiver,并重写父类onReceive()方法就可以了。当接收到广播的时候,在这个方法里面实现逻辑即可。如下,实现了一个查询是否有网络的广播:
        public class MainActivity extends AppCompatActivity {
            private IntentFilter intentFilter;
            private NetworkBroadcast networkBroadcast;

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                intentFilter=new IntentFilter();
                networkBroadcast=new NetworkBroadcast();
                //添加动作,检测网络状态
                intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
                //启动服务
                registerReceiver(networkBroadcast,intentFilter);

            }

            @Override
            protected void onDestroy() {
                super.onDestroy();
                //关闭广播
                unregisterReceiver(networkBroadcast);
            }

            class NetworkBroadcast extends BroadcastReceiver{

                @Override
                public void onReceive(Context contextIntent intent) {
                    Log.d("zlx","网络状态发生改变了");
                }
            }
        }
    • 注意点:因为广播中时不可以开启线程的,所以,耗时操作不能放到onReceive()中执行,当onReceive()运行较长时间而没有结束的话,系统就会报错。所以,我们常用广播实现打开程序其他组件。
                                        
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值