Android大喇叭---广播机制

Android提供了一套完整的API,允许应用来自由的发送+和接受广播。而广播接收者只需要关注广播的内容,而不需要关心广播是由谁发送的。广播发送是通过intent发送,广播接收者主要分成两类:标准广播,有序广播。

  • 标准广播:一种完全异步执行的广播,在广播发出后,所以广播接收器机会在同一时间接收到这条广播消息,没有优先级。这种广播效率比较高,不会检测优先级,同时也是无法被截断的。如下图(随手画)

    标准广播工作图

  • 有序广播:一种同步执行的广播,在广播发出之后,同一时刻只有一个广播(优先级)能够接收到这条广播,当这个广播的逻辑执行后,广播才会往下传递。所有的广播接收者是有先后顺序接受的,优先级高广播最先接受到广播,当执行完逻辑后并有权是否继续往下传递,既可以拦截广播。如下图
    这里写图片描述

广播的两种注册方式:

  • 动态注册:在代码中注册广播接收者,继承BroadcastReceiver,并重写父类方法onReceiver()方法,当有广播接收时,会执行该方法,具体逻辑可以在里面处理。
    例子(监听网络变化的例子):
public class MainActivity extends AppCompatActivity {

    private NetworkChangerReceiver networkChangerReceiver;

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

        IntentFilter intentFilter = new IntentFilter();
        //当网络变化的时候,系统会发送一下广播"android.net.conn.CONNECTIVITY_CHANGE"
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangerReceiver = new NetworkChangerReceiver();
        registerReceiver(networkChangerReceiver, intentFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //动态注册广播,一定要注意注销
        unregisterReceiver(networkChangerReceiver);
    }

    class NetworkChangerReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            //记得增加权限
            //   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
            //获取网络状态
            NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
            if(activeNetworkInfo != null && activeNetworkInfo.isAvailable()){
                Toast.makeText(MainActivity.this, "nice,终于来网了", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(MainActivity.this, "shut,网又断了了", Toast.LENGTH_SHORT).show();
            }
        }
    }
}
  • 静态注册:静态注册虽然没有动态注册的灵活性,但必须需要在程序启动的时候才行,而静态注册可以在程序未启动的情况下接收到广播。
    例子:创建一个开机启动的广播接收
    请单文件AndroidMainifest.xml的application下注册
            <receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
             <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
            </receiver>

enabled 表示这个是否启用这个广播接收者
exported 表示是否允许这个广播接收者能接收本程序以外的广播
“android.intent.action.BOOT_COMPLETED”:系统启动的广播
还记得要加开机权限

 <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.
          Toast.makeText(context,"哇,启动了啊",Toast.LENGTH_SHORT).show();
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值