Android实现监测网络状态
生活随笔
收集整理的這篇文章主要介紹了
Android实现监测网络状态
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文主要用到了安卓監測網絡狀態變化功能,實現了WIFI,3G,無網絡狀態切換時發出通知的功能。
主要知識點
service的基本知識
service可分為
按運行地點分類
- 本地服務
- 遠程服務
按按運行類型分類:
- 前臺服務
- 后臺服務
按使用方式分類:
- startService 啟動的服務
- bindService 啟動的服務
- startService 同時也 bindService 啟動的服務
service生命周期
詳情請見參考鏈接:
Android 中的 Service 全面總結 - - 博客頻道 - CSDN.NET
Android開發之如何保證Service不被殺掉(broadcast+system/app) - 其實并不難,是你太悲觀 - 博客頻道 - CSDN.NET
安卓監測網絡狀態變化
service部分
package com.zj.servicewifi;import java.util.Date; import java.util.Timer; import java.util.TimerTask;import android.app.Service; 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.os.Binder; import android.os.IBinder; import android.provider.SyncStateContract.Constants; import android.util.Log;public class WIFIService extends Service{int IntentId;int NOINTENT=0;int WIFI=1;int GRS=2;// 實時監聽網絡狀態改變 private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { Timer timer = new Timer(); timer.schedule(new QunXTask(getApplicationContext()), new Date()); } } }; public interface GetConnectState { public void GetState(int isConnected); // 網絡狀態改變之后,通過此接口的實例通知當前網絡的狀態,此接口在Activity中注入實例對象 } private GetConnectState onGetConnectState; public void setOnGetConnectState(GetConnectState onGetConnectState) { this.onGetConnectState = onGetConnectState; } private Binder binder = new MyBinder(); private boolean isContected = true; @Override public IBinder onBind(Intent intent) { return binder; } @Override public void onCreate() {// 注冊廣播 IntentFilter mFilter = new IntentFilter(); mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); // 添加接收網絡連接狀態改變的Action registerReceiver(mReceiver, mFilter); } class QunXTask extends TimerTask { private Context context; public QunXTask(Context context) { this.context = context; } @Override public void run() { if (is3GConnected(context)&&isWifiConnected(context)==false) { System.out.println("hereere*************");IntentId= 2;} else if(isWifiConnected(context)){IntentId=WIFI;}else { IntentId=NOINTENT;} if (onGetConnectState != null) { onGetConnectState.GetState(IntentId); // 通知網絡狀態改變 Log.i("mylog", "通知網絡狀態改變:" + IntentId); } } /* * 判斷是3G否有網絡連接 */ private boolean is3GConnected(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; } /* * 判斷是否有wifi連接 */ private boolean isWifiConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (mWiFiNetworkInfo != null) { return mWiFiNetworkInfo.isAvailable(); } } return false; } } public class MyBinder extends Binder { public WIFIService getService() { return WIFIService.this; } } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); // 刪除廣播 } }注意,其中用到廣播接收者,廣播接收者有兩種注冊方式,在代碼中注冊與在XML文件中注冊,本例中在代碼中注冊了,如果再在XML中注冊,會報錯
activity中代碼
package com.zj.servicewifi;import com.zj.servicewifi.WIFIService.GetConnectState;import android.app.Activity; import android.content.ComponentName; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast;public class MainActivity extends Activity {protected String TAG = "mylog"; WIFIService receiveMsgService; int IntentID=0;ServiceConnection sc;boolean state;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sc=new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stub}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubreceiveMsgService = ((WIFIService.MyBinder) service) .getService(); receiveMsgService.setOnGetConnectState(new GetConnectState() { // 添加接口實例獲取連接狀態 @Override public void GetState(int id) { if (IntentID != id) { // 如果當前連接狀態與廣播服務返回的狀態不同才進行通知顯示 IntentID = id; if (IntentID==0) {// 已連接 handler.sendEmptyMessage(0); } else if(IntentID==1){// 未連接 handler.sendEmptyMessage(1); } else if(IntentID==2){handler.sendEmptyMessage(2);}} } });}};}public void bind(View view){startService(new Intent(MainActivity.this,WIFIService.class));bindService(new Intent(MainActivity.this, WIFIService.class), sc, getApplicationContext().BIND_AUTO_CREATE);state = true;}public void unbind(View view){if(state ){unbindService(sc);state = false;}}public void start(View view){}public void stop(View view){}@Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); if(state){unbindService(sc);state = false;} } Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 0:Toast.makeText(MainActivity.this, "網絡未經連接" ,Toast.LENGTH_LONG).show(); break;case 1:// 已連接 Toast.makeText(MainActivity.this, "WIFI已經連接" ,Toast.LENGTH_LONG).show(); break; case 2:// 未連接 Toast.makeText(MainActivity.this, "3G已連接" ,Toast.LENGTH_LONG).show(); break; default: break; } ; }; }; }本例中最重要的一點就是在service中定義了一個接口,在activity中實例化,則在service中調用方法的時候,會調用在activity中實例化的方法,不知道這是什么設計模式,只覺得很神奇。
參考鏈接:
android 通過Service和Receiver來監聽網絡狀態 - - ITeye技術網站
Android判斷設備網絡連接狀態,并判斷連接方式 - lzan13的專欄 - 博客頻道 - CSDN.NET
完成
總結
以上是生活随笔為你收集整理的Android实现监测网络状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个绚丽的loading动效分析与实现!
- 下一篇: 基于PCA的人脸特征抽取