Android BroadcastReceiver 네트워크 상태 실시 간 감청 실현

선언:최근 회사 프로젝트 재 구성 은 사용자 의 체험 을 향상 시 키 기 위해 프로젝트 에 현재 네트워크 상태의 실시 간 감청 을 추가 하여 네트워크 상태 가 없 을 때 사용자 에 게 우호 적 인 알림 을 주 고 UI 인 터 페 이 스 를 수정 하도록 요구한다.본 고 는 4 대 구성 요소 중 하나 인 BroadcastReceiver 를 사용 하여 전체적인 네트워크 상태 감청 을 실현 하고 동적 방식 으로 등록 하 는 것 을 소개 한다.
BroadcastReceiver 의 등록 방식:
(1)동적 등록:즉,코드 에서 registerReceiver()방법 으로 등록 하고 동적 등록 은 onPause 나 onDestory 방법 에서 반 등록 해 야 합 니 다.그렇지 않 으 면 유출 이 발생 할 수 있 습 니 다.
(2)정적 등록:목록 파일 의 application 노드 에서탭 을 통 해 시스템 이 처음 시 작 될 때 자동 으로 등록 합 니 다.
효과 그림:

1.네트워크 상태 감청 인터페이스 및 방법 정의

/**
 *              
 */
public interface NetStatusMonitor {
 void onNetChange(boolean netStatus);
}

/**
 *           
 */
public void setStatusMonitor(NetStatusMonitor netStatusMonitor) {
 this.netStatusMonitor = netStatusMonitor;
}
2.네트워크 상태 도구 클래스

/**
 * Created by ruancw on 2018/5/27.
 *        
 */

public class NetUtil {
 //     
 private static final boolean NETWORK_NONE = false;
 //           
 private static final boolean NETWORK_AVAILABLE = true;

 /**
  *         
  * @param context      
  * @return boolean
  */
 public static boolean getNetStatus(Context context) {
  //            
  ConnectivityManager connectivityManager = (ConnectivityManager) context
    .getSystemService(Context.CONNECTIVITY_SERVICE);
  //        
  NetworkInfo activeNetworkInfo = connectivityManager != null ? connectivityManager
    .getActiveNetworkInfo() : null;
  //    NetworkInfo        
  if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
   //      
   return NETWORK_AVAILABLE;
   
  } else {
   return NETWORK_NONE;//     (   )
  }
 
 }
}
3.NetBroadcastReceiver 정의
NetBroadcastReceiver 는 BroadcastReceiver 에서 계승 하고 onReceive 방법 을 다시 씁 니 다.

/**
 * Created by ruancw on 2018/5/27.
 *       app     
 */

public class NetBroadcastReceiver extends BroadcastReceiver {
 //        
 private NetStatusMonitor netStatusMonitor;

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

  if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
   //         
   boolean netStatus = NetUtil.getNetStatus(context);
   if (netStatusMonitor != null)
    //                    
    netStatusMonitor.onNetChange(netStatus);
  }
 }

 /**
  *              
  */
 public interface NetStatusMonitor {
  void onNetChange(boolean netStatus);
 }

 /**
  *           
  */
 public void setStatusMonitor(NetStatusMonitor netStatusMonitor) {
  this.netStatusMonitor = netStatusMonitor;
 }
}
4.BaseActivity 에 등록
(1)BaseActivity 네트워크 상태 감청 인터페이스 구현
(2)onResume 에 등 록 된 방송

@Override
protected void onResume() {
 super.onResume();
 //           
 registerBroadcastReceiver();

}

/**
 *         
 */
private void registerBroadcastReceiver() {
 //    
 if (netBroadcastReceiver == null) {
  netBroadcastReceiver = new NetBroadcastReceiver();
  IntentFilter filter = new IntentFilter();
  filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
  registerReceiver(netBroadcastReceiver, filter);
  //    
  netBroadcastReceiver.setStatusMonitor(this);
 }
}
(3)onPause 또는 onDestory 에서 등록 취소

@Override
protected void onDestroy() {
 super.onDestroy();
 
 if (netBroadcastReceiver != null) {
  //    
  unregisterReceiver(netBroadcastReceiver);
 }
}
(4)네트워크 감청 인터페이스 재 작성 방법

@Override
public void onNetChange(boolean netStatus) {
 this.netStatus = netStatus;
 isNetConnect();
}

/**
 *             
 */
private void isNetConnect() {
 Message message=new Message();
 if (netStatus){
  message.what=99;
  handler.sendMessage(message);
 }else {
  UIUtil.toast("       ");
  message.what=100;
  handler.sendMessage(message);
 }

}

(5)메 인 스 레 드 수정 UI

@SuppressLint("HandlerLeak")
Handler handler = new Handler(){
 @Override
 public void handleMessage(Message msg) {
  super.handleMessage(msg);
  if (msg.what==100){
   tvNet.setVisibility(View.VISIBLE);
  }else {
   tvNet.setVisibility(View.GONE);
  }
 }
};
이렇게 하면 전체 네트워크 상태 감청 을 실현 하고 메 인 스 레 드 에서 UI 인터페이스 를 수정 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기