广播机制二(有序广播,无序广播和本地广播)

  • 自定义广播
    • 发送标准广播(无序广播):
      • 清单文件:
        <receiver android:name=".BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <!--自己定义的一个广播-->
                <action android:name="android.intent.action.CUSTOM_BROADCAST" />
            </intent-filter>
        </receiver>
      • 然后新建一个类,继承BroadcastReceiver类,在onReceiver()中实现逻辑代码:
        package com.example.mac.broadcast_demo;

        import android.content.BroadcastReceiver;
        import android.content.Context;
        import android.content.Intent;
        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""自定义标准广播已接收" );
            }
        }
      • 最后在MainActivity中使用Intent发送这个广播就可以了:
        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.support.v7.app.AppCompatActivity;
        import android.os.Bundle;
        import android.util.Log;
        import android.view.View;
        import android.widget.Button;

        public class MainActivity extends AppCompatActivity {
            private IntentFilter intentFilter;
            private NetworkBroadcast networkBroadcast;
            //
            private Button button;

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                button= (Button) findViewById(R.id.bt_sendBroadcast);
                button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Intent intent=new Intent("android.intent.action.CUSTOM_BROADCAST");
                        sendBroadcast(intent);
                    }
                });
                //调用动态注册
        //        NetworkRecevier();
            }

            //添加动态注册
            public void NetworkRecevier() {
                intentFilter new IntentFilter();
                networkBroadcast new NetworkBroadcast();
                //添加动作,检测网络状态
                intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
                //启动服务
                registerReceiver(networkBroadcastintentFilter);
            }

            @Override
            protected void onDestroy() {
                super.onDestroy();
                //关闭动态注册的广播
        //        unregisterReceiver(networkBroadcast);
            }

            class NetworkBroadcast extends BroadcastReceiver {

                @Override
                public void onReceive(Context contextIntent intent) {
                    //通过getSystemService得到ConnectivityManager的实例(系统服务类中专门管理网络连接的),
                    // 调用getActiveNetworkInfo可以得到NetworkInfo的实例。
                    //通过isAvailable判断是否有网络连接
                    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
                    if (networkInfo != null && networkInfo.isAvailable()) {
                        Log.d("zlx""亲,你可以上网了呢");
                   else {
                        Log.d("zlx""亲,没有网络连接哦");
                    }
                }
            }
        }
    • 发送有序广播:
      • 既然是有序,那么应该就是至少有两个广播接收器。所以我门就再新建个项目,同样,注册一个和上面这个一样的广播。代码略。
      • 第一步:发送广播:
           //发送标准广播
        //                sendBroadcast(intent);
        //                发送无序广播
        //                直接亮瞎,这样就可以发送无序的广播了,但是优先级得去清单文件中修改,毕竟,你是再清单文件中注册得麻。
                        sendOrderedBroadcast(intent,null);
      • 再清单文件中修改:
        <receiver android:name=".BootCompleteReceiver" >
            <!--android:priority="1"这个就是设置优先级了,1是低优先级。之前得尝试,发送广播得项目,会先Toast。所以需要给他一个低优先级-->
            <intent-filter android:priority="1">
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <!--自己定义的一个广播-->
                <action android:name="android.intent.action.CUSTOM_BROADCAST" />
            </intent-filter>
      • 如果有需求,可以在接收器中,把广播中断:
        @Override
        public void onReceive(Context contextIntent intent) {
            Toast.makeText(context,"已接收,我是Broadcast_demo",Toast.LENGTH_LONG).show();
            //终止广播。
            abortBroadcast();
        }
      • 有序广播没了。
  • 本地广播,因为广播机制决定了,其面向所有的程序,这个一个项目的安全性带来了考验,android推出本地广播机制,本地广播,只能在本项目使用(本地广播只有动态注册,没有静态注册)。
    • //本地广播,BootCompleteReceiver是我们写的继承BroadcastReceiver,实现广播接收后逻辑代码的一个类
      private LocalBroadcastManager localBroadcastManager;
      private BootCompleteReceiver receiver;
    •   localBroadcastManager=LocalBroadcastManager.getInstance(this);// 获得实例

              button= (Button) findViewById(R.id.bt_sendBroadcast);
              button.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      Intent intent=new Intent("android.intent.action.CUSTOM_BROADCAST");
                      //发送标准广播
      //                sendBroadcast(intent);
      //                发送无序广播
      //                直接亮瞎,这样就可以发送无序的广播了,但是优先级得去清单文件中修改,毕竟,你是再清单文件中注册得麻。
      //                sendOrderedBroadcast(intent,null);
      //                发送本地广播
                      localBroadcastManager.sendBroadcast(intent);
                  }
              });
              //调用动态注册
      //        NetworkRecevier();
      //        调用本地广播接收器
              LocalBroadcast();
    • //添加本地广播接收器
      public void LocalBroadcast(){
          intentFilter=new IntentFilter();
          intentFilter.addAction("android.intent.action.CUSTOM_BROADCAST" );
          receiver=new BootCompleteReceiver();
          localBroadcastManager.registerReceiver(receiver,intentFilter);

      }
    • 本地广播结束。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值