android写BroadcastReceiver(广播)实时监控网络状态:下面是具体实现的代码。
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:duration="300" android:drawable="@drawable/wifi0" /> <item android:duration="300" android:drawable="@drawable/wifi1" /> <item android:duration="300" android:drawable="@drawable/wifi2" /> <item android:duration="300" android:drawable="@drawable/wifi3" /> </animation-list>
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:duration="300" android:drawable="@drawable/ap1" /> <item android:duration="300" android:drawable="@drawable/ap2" /> <item android:duration="300" android:drawable="@drawable/ap3" /> </animation-list>
<?xml version="1.0" encoding="utf-8"?> <level-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:maxLevel="50" android:drawable="@drawable/wifi3" /> <item android:maxLevel="70" android:drawable="@drawable/wifi2" /> <item android:maxLevel="90" android:drawable="@drawable/wifi1" /> <item android:maxLevel="100" android:drawable="@drawable/wifi0" /> </level-list>
以上三个XML,wifi_animation.xml和wifi_ap_animation.xml是用于wifi和wifi热点在连接的过程中调用,都是300毫秒加载一张图片。wifi_level.xml是显示wifi信号强度,小于50为信号最佳,50-70为良,70-90为差,90-100是最差。
<?xml version="1.0" encoding="utf-8"?> <com.test.MainView xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/mianView" android:background="@drawable/background"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/wifiConnecting" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <ImageView android:id="@+id/lanImage" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <ImageView android:id="@+id/wifiAP" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout> <Button android:id="@+id/mBut" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Switching net" android:textColor="#FFFFFF" android:background="@drawable/button" android:layout_marginTop="50dip" android:layout_gravity="center"/> </com.test.MainView>
以下就是我们要现实的java代码。
package com.test;
import android.app.Activity;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class MainActivity extends Activity {
private static final String TAG = "MainActivity";
private MainView mMianView;
private WifiEnabler wifiEnabler;
private WifiApEnabler wifiApEnabler;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mMianView = (MainView) findViewById(R.id.mianView);
//实例WifiEnabler类
wifiEnabler = new WifiEnabler(this, mHandler);
//注册广播
wifiEnabler.resume();
wifiApEnabler = new WifiApEnabler(this, mHandler);
wifiApEnabler.resume();
}
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
Log.i(TAG, "==============" + msg.what);
switch (msg.what) {
case 0:
Log.i(TAG, "--------mHandler : 0----------");
mMianView.openingWifi();
break;
case 1:
Log.i(TAG, "--------mHandler : 1----------");
break;
case 2:
Log.i(TAG, "--------mHandler : 2----------");
break;
case 3:
Log.i(TAG, "--------mHandler : 3----------");
mMianView.setWifiState(false, 0);
break;
case 4:
Log.i(TAG, "--------mHandler : 4----------");
mMianView.setEthernetState(false);
break;
case 5:
Log.i(TAG, "--------mHandler : 5----------");
mMianView.setEthernetState(true);
break;
case 6:
Log.i(TAG, "--------mHandler : 6----------");
int wifiLevel = Math.abs(((WifiManager) getSystemService(WIFI_SERVICE)).getConnectionInfo().getRssi());
mMianView.setWifiState(true, wifiLevel);
break;
case 7:
Log.i(TAG, "--------mHandler : 7----------");
mMianView.openingWifiAP();
break;
case 8:
Log.i(TAG, "--------mHandler : 8----------");
mMianView.setWifiAP(true);
break;
case 9:
Log.i(TAG, "--------mHandler : 9----------");
mMianView.setWifiAP(false);
break;
case 10:
Log.i(TAG, "--------mHandler : 10----------");
mMianView.setWifiAP(false);
break;
case 11:
Log.i(TAG, "--------mHandler : 11----------");
mMianView.setWifiAP(true);
break;
default:
break;
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
//注销广播
if (wifiEnabler != null) {
wifiEnabler.pause();
}else if(wifiApEnabler != null){
wifiApEnabler.pause();
}
}
}
package com.test;
import android.content.Context;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.provider.Settings;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class MainView extends LinearLayout {
private static final String TAG = "MainView";
private ImageView wifiConnecting,wifiAP, mEthernetView;
private Button mBut;
private final AnimationDrawable wifiAnimation = (AnimationDrawable) getResources().getDrawable(R.drawable.wifi_animation);
private final AnimationDrawable wifiAPAnimation = (AnimationDrawable) getResources().getDrawable(R.drawable.wifi_ap_animation);
private Context mContext;
public MainView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
initLayout();
boolean ethernetValid = true;
String ethernet = android.os.SystemProperties.get("ro.ethernet.valid");
if (ethernet!=null && ethernet.equals("false")){
ethernetValid = false;
mEthernetView.setVisibility(View.GONE);
}
WifiManager wifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
int wifiLevel = Math.abs((wifiManager).getConnectionInfo().getRssi());
if(wifiManager.isWifiEnabled()){
ConnectivityManager connManager = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
if(!ethernetValid || wifiManager.isWifiEnabledInternal()){
//wifi connected
Log.i(TAG, "wifi ++++++++++++");
NetworkInfo.State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
if(NetworkInfo.State.CONNECTED==state){
Log.i(TAG, "wifi connected");
setWifiState(true,wifiLevel);
}else{
Log.i(TAG, "wifi ------------");
setWifiState(false,0);
}
}else if(ethernetValid){
//ethernet connected
Log.i(TAG, "ethernet +++++++++++++");
NetworkInfo.State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET).getState();
if(NetworkInfo.State.CONNECTED==state){
Log.i(TAG, "ethernet connected");
setEthernetState(true);
}else{
Log.i(TAG, "ethernet -------------");
setEthernetState(false);
}
}
}
mBut.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i(TAG, "------Button----Switching network-------");
mContext.startActivity(new Intent(
Settings.ACTION_WIRELESS_SETTINGS));
}
});
}
private void initLayout() {
wifiConnecting = (ImageView) findViewById(R.id.wifiConnecting);
mEthernetView = (ImageView) findViewById(R.id.lanImage);
wifiAP = (ImageView) findViewById(R.id.wifiAP);
mBut = (Button) findViewById(R.id.mBut);
}
protected void setWifiState(boolean connect, int wifiLevel) {
if (connect) {
wifiAnimation.stop();
mEthernetView.setImageResource(R.drawable.lan_unconnect);
Log.i(TAG, "---------setWifiState() open--------" + wifiLevel);
switch (wifiLevel) {
case 0:
Log.d(TAG, "------wifiLevel---------0-----"+wifiLevel);
wifiConnecting.setImageResource(R.drawable.wifi_level);
wifiConnecting.setImageLevel(wifiLevel);
break;
case 1:
Log.d(TAG, "------wifiLevel----------1------"+wifiLevel);
wifiConnecting.setImageResource(R.drawable.wifi_level);
wifiConnecting.setImageLevel(wifiLevel);
break;
case 2:
Log.d(TAG, "------wifiLevel--------2-------"+wifiLevel);
wifiConnecting.setImageResource(R.drawable.wifi_level);
wifiConnecting.setImageLevel(wifiLevel);
break;
case 3:
Log.d(TAG, "------wifiLevel--------3-------"+wifiLevel);
wifiConnecting.setImageResource(R.drawable.wifi_level);
wifiConnecting.setImageLevel(wifiLevel);
break;
default:
Log.d(TAG, "------wifiLevel---------4--------"+wifiLevel);
wifiConnecting.setImageResource(R.drawable.wifi_level);
wifiConnecting.setImageLevel(wifiLevel);
break;
}
} else {
wifiAnimation.stop();
wifiConnecting.setImageResource(R.drawable.wifi_unconnect);
mEthernetView.setImageResource(R.drawable.lan_unconnect);
Log.i(TAG, "---------setWifiState() stop--------");
}
}
protected void openingWifi() {
wifiConnecting.setImageDrawable(wifiAnimation);
wifiAnimation.start();
mEthernetView.setImageResource(R.drawable.lan_unconnect);
}
protected void openingWifiAP() {
wifiAP.setImageDrawable(wifiAPAnimation);
wifiAP.setVisibility(View.VISIBLE);
wifiAPAnimation.start();
}
protected void setWifiAP(boolean connect) {
if(connect){
wifiAPAnimation.stop();
wifiAP.setVisibility(View.VISIBLE);
wifiAP.setImageResource(R.drawable.ap3);
}else{
wifiAPAnimation.stop();
wifiAP.setVisibility(View.GONE);
}
}
protected void setEthernetState(boolean connect) {
if (connect) {
mEthernetView.setImageResource(R.drawable.lan_connected);
wifiAnimation.stop();
wifiConnecting.setImageResource(R.drawable.wifi_unconnect);
} else {
mEthernetView.setImageResource(R.drawable.lan_unconnect);
}
}
}
package com.test;
import java.util.ArrayList;
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.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Handler;
import android.os.Message;
public class WifiApEnabler {
private final Context mContext;
private Handler mHandler;
private WifiManager mWifiManager;
private final IntentFilter mIntentFilter;
ConnectivityManager mCm;
private String[] mWifiRegexs;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(action)) {
handleWifiApStateChanged(intent.getIntExtra(
WifiManager.EXTRA_WIFI_AP_STATE, WifiManager.WIFI_AP_STATE_FAILED));
} else if (ConnectivityManager.ACTION_TETHER_STATE_CHANGED.equals(action)) {
ArrayList<String> available = intent.getStringArrayListExtra(
ConnectivityManager.EXTRA_AVAILABLE_TETHER);
ArrayList<String> active = intent.getStringArrayListExtra(
ConnectivityManager.EXTRA_ACTIVE_TETHER);
ArrayList<String> errored = intent.getStringArrayListExtra(
ConnectivityManager.EXTRA_ERRORED_TETHER);
updateTetherState(available.toArray(), active.toArray(), errored.toArray());
}
}
};
public WifiApEnabler(Context context,Handler handler) {
mContext = context;
mHandler = handler;
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
mCm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
mWifiRegexs = mCm.getTetherableWifiRegexs();
mIntentFilter = new IntentFilter(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
mIntentFilter.addAction(ConnectivityManager.ACTION_TETHER_STATE_CHANGED);
}
public void resume() {
mContext.registerReceiver(mReceiver, mIntentFilter);
}
public void pause() {
mContext.unregisterReceiver(mReceiver);
}
private void updateTetherState(Object[] available, Object[] tethered, Object[] errored) {
boolean wifiTethered = false;
boolean wifiErrored = false;
for (Object o : tethered) {
String s = (String)o;
for (String regex : mWifiRegexs) {
if (s.matches(regex)) wifiTethered = true;
}
}
for (Object o: errored) {
String s = (String)o;
for (String regex : mWifiRegexs) {
if (s.matches(regex)) wifiErrored = true;
}
}
if (wifiTethered) {
WifiConfiguration wifiConfig = mWifiManager.getWifiApConfiguration();
Message msg = new Message();
msg.what = 11;
msg.obj = wifiConfig;
mHandler.sendMessage(msg);
} else if (wifiErrored) {
mHandler.sendEmptyMessage(-1);
}
}
private void handleWifiApStateChanged(int state) {
switch (state) {
case WifiManager.WIFI_STATE_ENABLING:
mHandler.sendEmptyMessage(7);
break;
case WifiManager.WIFI_STATE_ENABLED:
mHandler.sendEmptyMessage(8);
break;
case WifiManager.WIFI_STATE_DISABLING:
mHandler.sendEmptyMessage(9);
break;
case WifiManager.WIFI_STATE_DISABLED:
mHandler.sendEmptyMessage(10);
break;
default:
mHandler.sendEmptyMessage(-1);
}
}
}
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.test;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.NetworkInfo;
import android.net.wifi.SupplicantState;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.ethernet.EthernetManager;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class WifiEnabler {
private final Context mContext;
private static final String TAG = "WifiEnabler";
private final WifiManager mWifiManager;
private EthernetManager mEthManager;
private final IntentFilter mIntentFilter;
private Handler mHandler;
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.i("", "================>"+ action);
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
handleWifiStateChanged(intent.getIntExtra(
WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN));
}
else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) {
handleStateChanged(WifiInfo.getDetailedStateOf((SupplicantState)
intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE)));
}
else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
handleStateChanged(((NetworkInfo) intent.getParcelableExtra(
WifiManager.EXTRA_NETWORK_INFO)).getDetailedState());
}
else if (EthernetManager.ETHERNET_ALLOWED_STATE_CHANGED_ACTION.equals(action)) {
handleEthStateChanged(intent.getIntExtra(
EthernetManager.EXTRA_ETHERNET_STATE, EthernetManager.ETHERNET_STATE_UNKNOWN));
}
}
};
public WifiEnabler(Context context,Handler handler) {
mContext = context;
mHandler = handler;
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
mEthManager = (EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE);
mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
mIntentFilter.addAction(EthernetManager.ETHERNET_ALLOWED_STATE_CHANGED_ACTION);
}
public void resume() {
mContext.registerReceiver(mReceiver, mIntentFilter);
}
public void pause() {
mContext.unregisterReceiver(mReceiver);
}
private void handleWifiStateChanged(int state) {
switch (state) {
case WifiManager.WIFI_STATE_ENABLING:
mHandler.sendEmptyMessage(0);
break;
case WifiManager.WIFI_STATE_ENABLED:
mHandler.sendEmptyMessage(1);
break;
case WifiManager.WIFI_STATE_DISABLING:
mHandler.sendEmptyMessage(2);
break;
case WifiManager.WIFI_STATE_DISABLED:
mHandler.sendEmptyMessage(3);
break;
default:
mHandler.sendEmptyMessage(-1);
}
}
private void handleEthStateChanged(int state) {
if (state == EthernetManager.ETHERNET_STATE_DISABLED) {
mHandler.sendEmptyMessage(4);
}else{
mHandler.sendEmptyMessage(5);
}
}
private void handleStateChanged(NetworkInfo.DetailedState state) {
// WifiInfo is valid if and only if Wi-Fi is enabled.
// Here we use the state of the check box as an optimization.
if (state != null) {
WifiInfo info = mWifiManager.getConnectionInfo();
if (info != null) {
Message msg = new Message();
msg.what = 6;
msg.obj = info;
mHandler.sendMessage(msg);
}
}
}
}
实现的需求文档上截了个图片