1. 程式人生 > >Activity提示網路狀態變化

Activity提示網路狀態變化

實現效果

在網路狀態不可用的時候,在Activity的頂端顯示提示資訊,在網路可用時提示消失。

效果圖


實現方式

首先需要實現一個網路狀態變化的廣播:
public class NetworkReceiver extends BroadcastReceiver implements Observable{
	private static List<Observer> observers = new ArrayList<Observer>();
	private int state = 0;
	@Override
	public void onReceive(Context context, Intent intent) {
		state = checkNetworkInfo(context);
		notifyObserver();
	}

	public static int checkNetworkInfo(Context context) {
		ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo.State mobile = conMan.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
		NetworkInfo.State wifi = conMan.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
		if (mobile == NetworkInfo.State.CONNECTED || wifi == NetworkInfo.State.CONNECTED)
			return 1;
		if (mobile == NetworkInfo.State.CONNECTING || wifi == NetworkInfo.State.CONNECTING)
			return 0;
		return -1;
	}

	@Override
	public void registerObserver(Observer o) {
		observers.add(o);
	}

	@Override
	public void unregisterObserver(Observer o) {
		observers.remove(o);
	}

	@Override
	public void notifyObserver() {
		for(Observer o : observers){
			o.update(state);
		}
	}
}
上面程式碼裡接收網路狀態變化的廣播,並將它通知到Activity中。這樣,只需要在Activity裡接收這個通知就可以了。 Activity:
public void needNetworkState(boolean isNeed, int netResId, int nextResId) {
	if (isNeed) {
		receiver = new NetworkReceiver();
		IntentFilter filter = new IntentFilter();
		filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
		registerReceiver(receiver, filter);
		receiver.registerObserver(this);

		draw(netResId, nextResId);

		if (NetworkReceiver.checkNetworkInfo(this) < 0) {
			netState.setVisibility(View.VISIBLE);
		} else {
			netState.setVisibility(View.GONE);
		}

	}
}
在Activity裡註冊廣播,可以在onStart裡註冊,新增提示網路狀態的view(這一步可以直接使用xml佈局檔案,此處是為了方便以後直接使用,使用Java程式碼建立佈局)。
建立提示欄的點選事件,跳轉到系統設定頁面:
Intent intent = new Intent(Settings.ACTION_SETTINGS);
startActivity(intent);
最後,接收來自廣播的通知:
@Override
public void update(Object object) {
<span style="white-space:pre">	</span>// TODO Auto-generated method stub
	if((Integer)object < 0){
		netState.setVisibility(View.VISIBLE);
	} else {
		netState.setVisibility(View.GONE);
	}
}
</pre><pre name="code" class="java">我把這一操作整合到NetworkChangeActivity中
public class NetworkChangeActivity extends Activity implements Observer
這樣,直接繼承NetworkChangeActivity即可:
public class MainActivity extends NetworkChangeActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);
		this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);

		setContentView(R.layout.activity_main);

		needNetworkState(true, R.mipmap.wifi, R.mipmap.right_arrow);
	}
}