Android--BroadCast

今天主要学习安卓的四大组件之BroadCastReceiver个人感觉两个连起来比较易于理解。因为BroadCast会用到Receiver,用组合的名字更易于记忆和理解。

广播有自带的广播如监听短信广播,电话广播网络广播等等,当然你也可以自定义一个广播。广播会监控短信等状态是否发生变化一旦发生变化会去通知你,所以我们不用在service里写个一个去判断又费力又费时的程序,很多地方依靠广播监听判断即可。比较常用的就是网络状态判断。像优酷等播放器在播放的时候发现你使用的非WIFI状态会提醒你,可以帮助用户节省流量,避免在用户不知情的情况下使用4G等流量看事情。废话不多说直接看怎么使用。

NetListener

public class NetListener {
    Activity activity;
    OnNetChangeListener onNetChangeListener;
    NetWorkReceiver netWorkReceiver;

    public NetListener(Activity activity,OnNetChangeListener onNetChangeListener) {
        this.activity=activity;
        this.onNetChangeListener=onNetChangeListener;
    }
    public void onStart(){
        netWorkReceiver=new NetWorkReceiver();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        if(null!=netWorkReceiver&&null!=activity){//注册接收者
            activity.registerReceiver(netWorkReceiver,intentFilter);
        }
    }
    public void onStop(){
        if(null!=netWorkReceiver&&null!=activity){//取消注册
            activity.unregisterReceiver(netWorkReceiver);
        }
        netWorkReceiver=null;
    }
    public class NetWorkReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            String action=intent.getAction();
            if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION)){
                boolean isConnected=isNetworkConnected(context);
                boolean isWifi=isWifi(context);
                if(isConnected&&!isWifi){
                    if(null!=onNetChangeListener){
                        onNetChangeListener.onMobileConnected();
                    }
                }
            }
        }
        public boolean isNetworkConnected(Context context) {
            if (context != null) {
                ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
                if (mNetworkInfo != null) {
                    return mNetworkInfo.isAvailable();
                }
            }
            return false;
        }
        public boolean isWifi(Context mContext) {
            ConnectivityManager connectivityManager = (ConnectivityManager) mContext
                    .getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
            if (activeNetInfo != null
                    && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) {
                return true;
            }
            return false;
        }
    }
    public interface OnNetChangeListener{
        void onMobileConnected();
    }
}
该类先由下至上理解。OnNetChangeListener这个监听接口是便于以后的数据传输及方法调用。NetWorkReceiver是用来接收广播的,广播会有很多种,所以需要通过获取Action来进行判断和相应的处理,isWIFI和isNetWorkConnected是判断是否是wifi和是否连接。onStart和onStop是用来注册和解注册广播的。NetListener构造器是方便调用和传参。

那看Activity中怎么调用这个监听。

Activity

public class MainActivity extends AppCompatActivity implements MyListener.StateChangeListener, NetListener.OnNetChangeListener {
    MyListener myListener;
    NetListener netListener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myListener=new MyListener(this,this);
        netListener=new NetListener(this,this);
        Intent intent=new Intent(this, MyService.class);
        startService(intent);
    }

    @Override
    protected void onStart() {
        super.onStart();
        myListener.onStart();
        netListener.onStart();
    }

    @Override
    protected void onStop() {
        super.onStop();
        myListener.onDestory();
        netListener.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        myListener.onDestory();
    }

    @Override
    public void myplay() {
        Toast.makeText(this,"broadcast-----------------------myplay",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void mypause() {
        Toast.makeText(this,"broadcast-----------------------mypause",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void mystop() {
        Toast.makeText(this,"broadcast-----------------------mystop",Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onMobileConnected() {
        Toast.makeText(this,"现在使用的是非WIFI",Toast.LENGTH_SHORT).show();
    }
}
继承NetListener里的接口OnNetChangeListener,实现相应的方法,在Activity的onStart和onStop中调用监听的onstart和onstop方法,即注册receiver和解注册。点击运行时,切换wifi网络和4G网络会弹出吐司。

下面讲自定义的广播。

public class MyListener {
    public static String ACTION="myaction";
    Activity activity;
    StateChangeListener stateChangeListener;
    MyReceiver myReceiver;

    public MyListener(Activity activity,StateChangeListener stateChangeListener) {
        this.activity=activity;
        this.stateChangeListener=stateChangeListener;
    }
    public void onStart(){
        myReceiver=new MyReceiver();
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction(ACTION);
        if(null!=myReceiver&&null!=activity){
            activity.registerReceiver(myReceiver,intentFilter);
        }
    }
    public void onDestory(){
        if(null!=myReceiver&&null!=activity){
            activity.unregisterReceiver(myReceiver);
        }
        myReceiver=null;
    }
    public class MyReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            String action=intent.getAction();
            if(action.equals(MyListener.ACTION)){
                int state=intent.getIntExtra("state",0);
                if(state==0){
                    if(null!=stateChangeListener){
                        stateChangeListener.myplay();
                    }
                }else if(state==1){
                    if(null!=stateChangeListener){
                        stateChangeListener.mypause();
                    }
                }else if(state==2){
                    if(null!=stateChangeListener){
                        stateChangeListener.mystop();
                    }
                }
            }
        }
    }
    public interface StateChangeListener{
        void myplay();
        void mypause();
        void mystop();
    }
}
StateChangeListener是监听接口,MyReceiver是接收广播者,onStart和onDestory是注册和解注册广播的方法。这里值得注意的是常量ACTION,因为是自定义的广播没有响应的Action所以我们要自己定义个ACTION便于程序运行的时候进行区别。运行跟正常的广播没有区别。当然广播和Activity之间的交互有很多方法,像IBinder 和ServiceConnection的使用,但是个人感觉都不如接口来的直接便于观察。


程序下载地址https://github.com/Maliola/MyBroadCastTest点击打开链接

欢迎纠错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值