Android--BroadCast

来源:互联网 发布:mysql 5.6 mac dmg 编辑:程序博客网 时间:2024/06/10 10:20

今天主要学习安卓的四大组件之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
原创粉丝点击