一、定義ReceiveService類
當接收到的網絡狀態發生改變時通知Activity,需要一個Service,並且綁定該到Activity。
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.util.Log;public class ReceiveMsgService extends Service { 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 NetworkTask(getApplicationContext()), new Date()); } } }; public interface GetConnectState { void GetState(boolean isConnected); // 網絡狀態改變之後,通過此接口的實例通知當前網絡的狀態,此接口在Activity中注入實例對象 } private GetConnectState onGetConnectState; public void setOnGetConnectState(GetConnectState onGetConnectState) { this.onGetConnectState = onGetConnectState; } private Binder binder = new MyBinder(); private boolean isConnected = 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 NetworkTask extends TimerTask { private Context context; public NetworkTask(Context context) { this.context = context; } @Override public void run() { if (isNetworkConnected(context)) { isConnected = true; } else { isConnected = false; } if (onGetConnectState != null) { onGetConnectState.GetState(isConnected); // 通知網絡狀態改變 } } /* * 判斷是否有網絡連接 */ private boolean isNetworkConnected(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity == null) { return false; } else { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) { for (NetworkInfo net : info) { if (net.getState() == NetworkInfo.State.CONNECTED) { return true; } } } } return false; } } public class MyBinder extends Binder { public ReceiveMsgService getService() { return ReceiveMsgService.this; } } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mReceiver); // 刪除廣播 }}
二、接下來在Activity中,綁定服務
注意:在TabActivity的子Activity中使用service時,bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE),需要改爲:
this.getApplicationContext().bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE) ,纔可正常使用。
public class MainActivity extends Activity { ReceiveMsgService receiveMsgService; private boolean conncetState = true; // 記錄當前連接狀態 @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.page_main); bind(); } private void bind() { Intent intent = new Intent(MainActivity.this, ReceiveMsgService.class); bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); } private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { receiveMsgService = ((ReceiveMsgService.MyBinder) service) .getService(); receiveMsgService.setOnGetConnectState(new GetConnectState() { // 添加接口實例獲取連接狀態 @Override public void GetState(boolean isConnected) { if (conncetState != isConnected) { // 如果當前連接狀態與廣播服務返回的狀態不同才進行通知顯示 conncetState = isConnected; if (conncetState) {// 已連接 handler.sendEmptyMessage(1); } else {// 未連接 handler.sendEmptyMessage(2); } } } }); } }; private void unbind() { if (receiveMsgService != null ) { unbindService(serviceConnection); } } Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case 1:// 已連接 Toast.makeText(MainActivity.this, "網絡已經連接" ,Toast.LENGTH_LONG).show(); break; case 2:// 未連接 Toast.makeText(MainActivity.this, "網絡未連接" ,Toast.LENGTH_LONG).show(); break; default: break; } ; }; }; @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); unbind(); } }
三、在Manifest中註冊Serevice和相關權限
<usespermission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> //註冊service <service android:enabled="true" android:name=".ReceiveMsgService" />