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); } } } }
实现的需求文档上截了个图片