今天主要学习安卓的四大组件之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点击打开链接
欢迎纠错