[Android] Android中WIFI開發總結二

MainActivity類:(處理wifi消息,加載UI)

/**
 * 主界面
 * @author ZHF
 *
 */
public class MainActivity extends Activity implements EventHandler{
    //消息事件
    public static final int m_nWifiSearchTimeOut = 0;// 搜索超時
    public static final int m_nWTScanResult = 1;// 搜索到wifi返回結果
    public static final int m_nWTConnectResult = 2;// 鏈接上wifi熱點
    public static final int m_nCreateAPResult = 3;// 建立熱點結果
    public static final int m_nUserResult = 4;// 用戶上線人數更新命令(待定)
    public static final int m_nWTConnected = 5;// 點擊鏈接後斷開wifi,3.5秒後刷新adapter
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    //一些常量
    public static final String PACKAGE_NAME = "com.zhf.wifidemo.wifi";  //應用包名
    public static final String FIRST_OPEN_KEY = "version";  //版本號信息
    public static final String WIFI_AP_HEADER = "zhf_";
    public static final String WIFI_AP_PASSWORD ="zhf12345";
    //wifi操做事件(枚舉)-->方便彈出對話框處理事件
    private int wFOperateEnum = WFOperateEnum.NOTHING;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    //三個重要的類
    public WFSearchProcess m_wtSearchProcess; //WiFi搜索進度條線程
    public WifiAdmin m_wiFiAdmin; //Wifi管理類
    public CreateAPProcess m_createAPProcess; //建立Wifi熱點線程
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    //相關控件
    private WFSearchAnimationFrameLayout m_FrameLWTSearchAnimation;  //自定義雷達動畫布局
    private GifView m_gifRadar;  //wifi信號動畫布局
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
                                                                                                                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    private LinearLayout m_linearLCreateAP; //建立熱點View
    private ProgressBar m_progBarCreatingAP; //建立熱點進度條
    private TextView m_textVPromptAP; //建立熱點進度條文字
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    private Button m_btnBack; //左上角返回按鈕
    private Button m_btnSearchWF; //右上角wifi搜索按鈕
    private Button m_btnCreateWF; //建立wifi熱點
    private ListView m_listVWT; //顯示信息
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    private LinearLayout m_LinearLDialog; //提醒對話框
    private TextView m_textVContentDialog;  //對話框文本內容
    private Button m_btnConfirmDialog, m_btnCancelDialog; //提醒對話框上的按鈕
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    private TextView m_textVWTPrompt; //中間文字提示
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    private boolean m_isFirstOpen = true;  //標記是不是第一次打開
    ArrayList<ScanResult> m_listWifi = new ArrayList();//檢測到熱點信息列表
    private WTAdapter m_wTAdapter; //網絡列表適配器
    public Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case m_nWifiSearchTimeOut: // 搜索超時
                m_wtSearchProcess.stop();
                m_FrameLWTSearchAnimation.stopAnimation();
                m_listWifi.clear();  //網絡列表
                //設置控件
                m_textVWTPrompt.setVisibility(View.VISIBLE);
                m_textVWTPrompt.setText("須要從新搜索,點右上角從新搜索或建立新的熱點...");
                break;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
            case m_nWTScanResult:  //掃描到結果
                m_listWifi.clear();
                if(m_wiFiAdmin.mWifiManager.getScanResults() != null) {
                    for (int i = 0; i < m_wiFiAdmin.mWifiManager.getScanResults().size(); i++) {
                        ScanResult scanResult = m_wiFiAdmin.mWifiManager.getScanResults().get(i);
                        //和指定鏈接熱點比較,將其餘的過濾掉!
                        if(scanResult.SSID.startsWith(WIFI_AP_HEADER)) {
                            m_listWifi.add(scanResult);
                        }
                    }
                    if(m_listWifi.size() > 0) {
                        m_wtSearchProcess.stop();
                        m_FrameLWTSearchAnimation.stopAnimation();
                        m_textVWTPrompt.setVisibility(View.GONE);
                        //更新列表,顯示出搜索到的熱點
                        m_wTAdapter.setData(m_listWifi);
                        m_wTAdapter.notifyDataSetChanged();
                    }
                }
                break;
            case m_nWTConnectResult:  //鏈接結果
                m_wTAdapter.notifyDataSetChanged(); //刷新適配器數據
                break;
            case m_nCreateAPResult:  //建立wifi熱點結果
                m_createAPProcess.stop();
                m_progBarCreatingAP.setVisibility(View.GONE); //旋轉進度條
                if((m_wiFiAdmin.getWifiApState() == 3 || m_wiFiAdmin.getWifiApState() == 13) && (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) {
                    //設置控件
                    m_textVWTPrompt.setVisibility(View.GONE);
                    m_linearLCreateAP.setVisibility(View.VISIBLE);
                    m_btnCreateWF.setVisibility(View.VISIBLE);
                    m_gifRadar.setVisibility(View.VISIBLE);
                    m_btnCreateWF.setBackgroundResource(R.drawable.x_ap_close);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
                    m_textVPromptAP.setText("熱點建立成功!"+ "\n熱點名:"+ m_wiFiAdmin.getApSSID()+ "\n鏈接密碼:zhf12345");
                } else {
                    m_btnCreateWF.setVisibility(View.VISIBLE);
                    m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create);
                    m_textVPromptAP.setText("熱點建立失敗,您能夠從新建立或者搜索其它熱點");
                }
                break;
            case m_nUserResult :
                //更新用戶上線人數
                break;
            case m_nWTConnected:  //點擊鏈接後斷開wifi,3.5s後刷新
                m_wTAdapter.notifyDataSetChanged();
                break;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
            }
        };
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wt_main);
        //搜索Wifi
        m_wtSearchProcess = new WFSearchProcess(this);
        //建立Wifi熱點
        m_createAPProcess = new CreateAPProcess(this);
        //wifi管理類
        m_wiFiAdmin  = WifiAdmin.getInstance(this);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
        //初始化View
        initView();
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    /**初始化View**/
    private void initView() {
        // 監聽廣播
        WIFIBroadcast.ehList.add(this);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
        /******************************實例化佈局**************************************/
        m_linearLCreateAP = (LinearLayout) findViewById(R.id.create_ap_llayout_wt_main);  //建立熱點View
        m_progBarCreatingAP = (ProgressBar) findViewById(R.id.creating_progressBar_wt_main);  //建立熱點進度條
        m_textVPromptAP = (TextView) findViewById(R.id.prompt_ap_text_wt_main); //建立熱點進度條文字
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
        m_FrameLWTSearchAnimation = ((WFSearchAnimationFrameLayout) findViewById(R.id.search_animation_wt_main));// 搜索時的動畫
        m_listVWT = ((ListView) findViewById(R.id.wt_list_wt_main));// 搜索到的熱點listView
        //注意此處
        m_wTAdapter = new WTAdapter(this, m_listWifi);
        m_listVWT.setAdapter(m_wTAdapter);
        m_textVWTPrompt = (TextView) findViewById(R.id.wt_prompt_wt_main); //中間提醒文字
        m_gifRadar = (GifView) findViewById(R.id.radar_gif_wt_main); //gif動畫
        //提醒對話框佈局
        m_LinearLDialog = (LinearLayout) findViewById(R.id.dialog_layout_wt_main);
        m_textVContentDialog = (TextView) findViewById(R.id.content_text_wtdialog);
        m_btnConfirmDialog = (Button) findViewById(R.id.confirm_btn_wtdialog);
        m_btnCancelDialog = (Button) findViewById(R.id.cancel_btn_wtdialog);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
        //左上角返回鍵
        m_btnBack = (Button) findViewById(R.id.back_btn_wt_main);
        m_btnBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                onBackPressed(); //至關於調用系統返回鍵,結束當前Activity
            }
        });
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
        //右上角搜索熱點按鈕
        m_btnSearchWF = (Button) findViewById(R.id.search_btn_wt_main);
        m_btnSearchWF.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!m_wtSearchProcess.running) { //搜索線程沒有開啓
                    //1.當前熱點或wifi鏈接着    WIFI_STATE_ENABLED 3 //WIFI_AP_STATE_ENABLED  13
                    if(m_wiFiAdmin.getWifiApState() == 3 || m_wiFiAdmin.getWifiApState() == 13) {
                        wFOperateEnum = WFOperateEnum.SEARCH; //搜索wifi事件
                        m_LinearLDialog.setVisibility(View.VISIBLE); ///wifi提示對話框顯示
                        m_textVContentDialog.setText("是否關閉當前熱點去搜索其餘熱點?");
                        return;  //跳出此方法,交由對話框來處理事件
                    }
                    //2.當前沒有熱點或wifi鏈接着
                    if(!m_wiFiAdmin.mWifiManager.isWifiEnabled()) { //若是wifi沒打開
                        m_wiFiAdmin.OpenWifi();
                    }
                    m_textVWTPrompt.setVisibility(View.VISIBLE); //中間提示文字
                    m_textVWTPrompt.setText("正在搜索附近的熱點...");
                    m_linearLCreateAP.setVisibility(View.GONE); //建立wifi熱點佈局消失
                    m_gifRadar.setVisibility(View.GONE); //熱點鏈接動畫消失
                    m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create); //更改按鈕文字「建立」
                    //開始搜索wifi
                    m_wiFiAdmin.startScan();
                    m_wtSearchProcess.start(); //開啓搜索線程
                    m_FrameLWTSearchAnimation.startAnimation(); //開啓波紋動畫
                }else {//搜索線程開啓着,再次點擊按鈕
                    //從新啓動
                    m_wtSearchProcess.stop();
                    m_wiFiAdmin.startScan();    //開始搜索wifi
                    m_wtSearchProcess.start();
                }
            }
        });
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
        //中間建立wifi熱點按鈕
        m_btnCreateWF = (Button) findViewById(R.id.create_btn_wt_main);
        m_btnCreateWF.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(m_wiFiAdmin.getWifiApState() == 4) { // WIFI_STATE_UNKNOWN
                    Toast.makeText(getApplicationContext(),"您的設備不支持熱點建立!", Toast.LENGTH_SHORT).show();
                    return;
                }
                if(m_wiFiAdmin.mWifiManager.isWifiEnabled()) { //目前連着wifi
                    wFOperateEnum = WFOperateEnum.CREATE;  //wifi熱點建立事件
                    m_LinearLDialog.setVisibility(View.VISIBLE); //對話框可用
                    m_textVContentDialog.setText("建立熱點會關閉當前的WiFi,確認繼續?");
                    return;
                }
                if((m_wiFiAdmin.getWifiApState() == 3 || m_wiFiAdmin.getWifiApState() == 13)
                        && (!m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) {//目前鏈接着其餘熱點名
                    wFOperateEnum = WFOperateEnum.CREATE;  //wifi熱點建立事件
                    m_LinearLDialog.setVisibility(View.VISIBLE);
                    m_textVContentDialog.setText("系統熱點被佔用,點肯定開啓熱點以傳輸文件!");
                    return;
                }
                if (((m_wiFiAdmin.getWifiApState() == 3) || (m_wiFiAdmin.getWifiApState() == 13))
                        && (m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER))) {//目前鏈接着本身指定的Wifi熱點
                    wFOperateEnum = WFOperateEnum.CLOSE;  //wifi熱點關閉事件
                    m_LinearLDialog.setVisibility(View.VISIBLE);
                    m_textVContentDialog.setText("關閉熱點會中斷當前傳輸,您肯定這麼作?");
                    return;
                }
                if(m_wtSearchProcess.running) {
                    m_wtSearchProcess.stop(); //中止線程
                    m_FrameLWTSearchAnimation.stopAnimation(); //中止動畫
                }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                /******************點擊建立熱點時沒有鏈接wifi或熱點的狀況*****************************/
                //關閉Wifi
                m_wiFiAdmin.closeWifi();
                //建立熱點(名字,密碼,加密類型,wifi/ap類型)
                m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(WIFI_AP_HEADER + getLocalHostName(), WIFI_AP_PASSWORD, 3, "ap"), true);
                m_createAPProcess.start(); //開啓建立熱點線程
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
                //將wifi信息列表設置到listview中
                m_listWifi.clear();
                m_wTAdapter.setData(m_listWifi);
                m_wTAdapter.notifyDataSetChanged();
                //設置佈局
                m_linearLCreateAP.setVisibility(View.VISIBLE); //熱點佈局可用
                m_progBarCreatingAP.setVisibility(View.VISIBLE);
                m_textVPromptAP.setText("正在建立熱點"); //進度條文字
                m_btnCreateWF.setVisibility(View.GONE); //點擊一次不可再點
                m_textVWTPrompt.setVisibility(View.GONE);
            }
        });
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
        //對話框確認按鈕
        m_btnConfirmDialog.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                m_LinearLDialog.setVisibility(View.GONE); //讓對話框佈局消失
                switch (wFOperateEnum) { //根據wifi操做事件
                case WFOperateEnum.CLOSE:  //關閉wifi熱點
                    //設置佈局
                    m_textVWTPrompt.setVisibility(View.VISIBLE);
                    m_textVWTPrompt.setText("熱點已關閉!能夠進行其餘操做了!"); //中間提醒文字
                    m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create); //按鈕文字改回「建立」
                    m_gifRadar.setVisibility(View.GONE); //熱點動畫中止
                    m_linearLCreateAP.setVisibility(View.GONE); //下部建立熱點佈局不可用
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
                    //關閉熱點
                    m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(m_wiFiAdmin.getApSSID(), "zhf123456", 3, "ap"), false);
                    break;
                case WFOperateEnum.CREATE:  //建立wifi熱點
                    if(m_wtSearchProcess.running) {
                        m_wtSearchProcess.stop();  //搜索wifi線程中止
                        m_FrameLWTSearchAnimation.stopAnimation(); //搜索wifi動畫中止
                    }
                    //關閉wifi
                    m_wiFiAdmin.closeWifi();
                    //建立WiFi熱點
                    m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(WIFI_AP_HEADER + getLocalHostName(), WIFI_AP_PASSWORD, 3, "ap"),true);
                    m_createAPProcess.start();
                    //刷新listView佈局
                    m_listWifi.clear();
                    m_wTAdapter.setData(m_listWifi);
                    m_wTAdapter.notifyDataSetChanged();
                    //設置佈局
                    m_linearLCreateAP.setVisibility(View.VISIBLE);
                    m_progBarCreatingAP.setVisibility(View.VISIBLE); //旋轉進度條
                    m_btnCreateWF.setVisibility(View.GONE);
                    m_textVWTPrompt.setVisibility(View.GONE);
                    m_textVPromptAP.setText("正在建立熱點..."); //進度條文字
                    break;
                case WFOperateEnum.SEARCH:  //搜索可用熱點
                    //設置佈局
                    m_textVWTPrompt.setVisibility(View.VISIBLE);
                    m_textVWTPrompt.setText("正在搜索附近的熱點...");
                    m_linearLCreateAP.setVisibility(View.GONE); //建立熱點佈局不可用
                    m_btnCreateWF.setVisibility(View.VISIBLE);
                    m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create); //按鈕文字改回「建立」
                    m_gifRadar.setVisibility(View.GONE); //熱點動畫中止
                    m_linearLCreateAP.setVisibility(View.GONE); //下部建立熱點佈局不可用
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
                    //搜索熱點線程關閉
                    if (m_createAPProcess.running)
                        m_createAPProcess.stop();
                    //關閉熱點
                    m_wiFiAdmin.createWifiAP(m_wiFiAdmin.createWifiInfo(m_wiFiAdmin.getApSSID(), WIFI_AP_PASSWORD, 3, "ap"),false);
                    //打開wifi
                    m_wiFiAdmin.OpenWifi();
                    m_wtSearchProcess.start();
                    m_FrameLWTSearchAnimation.startAnimation();
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
                    break;
                }
            }
        });
        //對話框取消按鈕事件
        m_btnCancelDialog.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //對話框佈局消失
                m_LinearLDialog.setVisibility(View.GONE);
            }
        });
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    /**Wifi是否鏈接**/
    private boolean isWifiConnect() {
        boolean isConnect = true;
        //用於網絡鏈接狀態的檢測
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        if(!cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).isConnected())
            isConnect = false;
        return isConnect;
    }
    /**獲取wifi熱點狀態**/
    public boolean getWifiApState() {
        try {
            WifiManager localWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            Method m = localWifiManager.getClass().getMethod("getWifiApState", new Class[0]);
            int i = (Integer)(m.invoke(localWifiManager, new Object[0]));
            return (3 == i) || (13 == i);  //WIFI_STATE_ENABLED 3  //WIFI_AP_STATE_ENABLED  13
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    /**獲取手機信息**/
    public String getLocalHostName() {
        String str1 = Build.BRAND; //主板
        String str2 = Build.MODEL;  //機型
        if (-1 == str2.toUpperCase().indexOf(str1.toUpperCase()))
            str2 = str1 + "_" + str2;
        return str2;
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    private void init() {
        //線程是否在運行
        if(this.m_wtSearchProcess.running || this.m_createAPProcess.running) {
            return;
        }
        //沒有鏈接上wifi或者是wifi熱點
        if(!isWifiConnect() && !getWifiApState()) {
            m_wiFiAdmin.OpenWifi();
            m_wtSearchProcess.start(); //開啓搜索wifi超時檢測線程
            m_wiFiAdmin.startScan(); //開啓搜索wifi
            //開啓搜索動畫
            m_FrameLWTSearchAnimation.startAnimation();
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
            //設置控件
            m_textVWTPrompt.setVisibility(View.VISIBLE);
            m_textVWTPrompt.setText(" 正在搜索附近的熱點...");
            m_linearLCreateAP.setVisibility(View.GONE);
            m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create);
        }
        //鏈接上wifi
        if(isWifiConnect()) {
            this.m_wiFiAdmin.startScan();
            this.m_wtSearchProcess.start();
            this.m_FrameLWTSearchAnimation.startAnimation();
            //設置控件
            this.m_textVWTPrompt.setVisibility(0);
            this.m_textVWTPrompt.setText("正在搜索附近的熱點...");
            this.m_linearLCreateAP.setVisibility(View.GONE);
            this.m_btnCreateWF.setBackgroundResource(R.drawable.x_wt_create);
            this.m_gifRadar.setVisibility(View.GONE);
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                
            m_listWifi.clear();
            if(m_wiFiAdmin.mWifiManager.getScanResults() != null) {
                for (int i = 0; i < m_wiFiAdmin.mWifiManager.getScanResults().size(); i++) {
                    //識別出本身自定鏈接的wifi
                    if(m_wiFiAdmin.mWifiManager.getScanResults().get(i).SSID.startsWith(WIFI_AP_HEADER)) {
                        m_listWifi.add(m_wiFiAdmin.mWifiManager.getScanResults().get(i)); //將指定wifi添加進去
                    }
                }
                m_wTAdapter.setData(m_listWifi); //將鏈接的信息添加到listView中
                m_wTAdapter.notifyDataSetChanged();
            }
            //鏈接上wifi熱點
            if(getWifiApState()){
                if(m_wiFiAdmin.getApSSID().startsWith(WIFI_AP_HEADER)) {
                    //設置控件
                    m_textVWTPrompt.setVisibility(View.GONE);
                    m_linearLCreateAP.setVisibility(View.VISIBLE);
                    m_progBarCreatingAP.setVisibility(View.GONE);
                    m_btnCreateWF.setVisibility(View.VISIBLE);
                    m_gifRadar.setVisibility(View.VISIBLE);
                    m_btnCreateWF.setBackgroundResource(R.drawable.x_ap_close);
                    m_textVPromptAP.setText("\n熱點名:"+ m_wiFiAdmin.getApSSID() + "\n鏈接密碼:zhf12345");
                }
            }
        }
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        WIFIBroadcast.ehList.remove(this);
    }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
    @Override
    public void handleConnectChange() {
        Message msg = mHandler.obtainMessage(m_nWTConnectResult);
        mHandler.sendMessage(msg);
    }
    @Override
    public void scanResultsAvaiable() {
        Message msg = mHandler.obtainMessage(m_nWTScanResult);
        mHandler.sendMessage(msg);
    }
    @Override
    public void wifiStatusNotification() {
        m_wiFiAdmin.mWifiManager.getWifiState(); //獲取當前wifi狀態
    }
}

貌似有點長。。。簡單說明一下:java

   1.首先,初始化主界面(xml有些複雜,慢慢理一下就行了,不是什麼大問題)接下來,處理三個重要的按鈕事件:右上角的搜索wifi按鈕、中間建立或關閉熱點按鈕、對話框中肯定按鈕。處理前二者事件時,需關注當前wifi狀態,若爲佔用,需彈出提醒對話框來根據當前WiFi操做(WFOperateEnum類中定義好了)事件,來建立、關閉、搜索等具體事務。android

   2.之因此定義廣播接收者,是爲了監聽當wifi狀態發生變化時,可以及時更新界面網絡

廣播接收者WIFIBroadcast類:
ide

package com.zhf.wifidemo.broadcast;
import java.util.ArrayList;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.util.Log;
/**
 * 監聽wifi熱點變化
 * @author ZHF
 *
 */
public class WIFIBroadcast extends BroadcastReceiver{
    public static ArrayList<EventHandler> ehList = new ArrayList<EventHandler>();
                                                                                                                                                                                                                                                                                                                                                 
    @Override
    public void onReceive(Context context, Intent intent) {
        //搜索到wifi熱點結果的廣播:  "android.net.wifi.SCAN_RESULTS"
        if(intent.getAction().endsWith(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
            Log.i("WTScanResults---->掃描到了可用網絡---->", "android.net.wifi.SCAN_RESULTS");
            //遍歷通知各個監聽接口
            for(int i = 0; i < ehList.size(); i++) {
                ((EventHandler)ehList.get(i)).scanResultsAvaiable();
            }
                                                                                                                                                                                                                                                                                                                                                         
        //wifi打開或關閉狀態變化   "android.net.wifi.WIFI_STATE_CHANGED"
        }else if(intent.getAction().endsWith(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
            Log.i("WTScanResults----->wifi狀態變化--->", "android.net.wifi.WIFI_STATE_CHANGED");
            //這裏不須要鏈接一個SSID(wifi名稱)
            for(int j = 0; j < ehList.size(); j++) {
                ((EventHandler)ehList.get(j)).wifiStatusNotification();
            }
                                                                                                                                                                                                                                                                                                                                                         
        //鏈接上一個SSID後發出的廣播,(注:與android.net.wifi.WIFI_STATE_CHANGED的區別)
        }else if(intent.getAction().endsWith(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
            Log.i("WTScanResults----->網絡狀態變化---->", "android.net.wifi.STATE_CHANGE");
            for(int m = 0; m < ehList.size(); m++) {
                ((EventHandler)ehList.get(m)).handleConnectChange();
            }
        }
    }
    /**
     * 事件監聽接口
     * @author ZHF
     *
     */
    public static abstract interface EventHandler {
        /**處理鏈接變化事件**/
        public abstract void handleConnectChange();
        /**掃描結果是有效事件**/
        public abstract void scanResultsAvaiable();
        /**wifi狀態變化事件**/
        public abstract void wifiStatusNotification();
    }
                                                                                                                                                                                                                                                                                                                                                 
}

說明:監聽系統wifi狀態變化,內部定義了一個事件處理接口,當wifi狀態發生變化時,讓其實現類去發送消息更新界面。
佈局

CreateAPProcess類:
動畫

package com.zhf.wifidemo.ui;
import android.net.wifi.WifiManager;
import android.os.Message;
import com.zhf.wifidemo.wifi.MainActivity;
/**
 * 建立Wifi熱點
 * @author ZHF
 *
 */
public class CreateAPProcess implements Runnable{
                                                                                                                                                                                              
    public MainActivity context;
                                                                                                                                                                                              
    public boolean running = false;
    private long startTime = 0L;
    private Thread thread = null;
    public CreateAPProcess(MainActivity context) {
        super();
        this.context = context;
    }
    @Override
    public void run() {
        while(true) {
            if(!running)  return;
            //WIFI_STATE_ENABLED 3
            //WIFI_AP_STATE_ENABLED  13
            if((context.m_wiFiAdmin.getWifiApState() == WifiManager.WIFI_STATE_ENABLED)
                    || (context.m_wiFiAdmin.getWifiApState() == 13)
                    || (System.currentTimeMillis() - this.startTime >= 30000L)){
                //wifi可用 或 熱點可用
                Message msg = context.mHandler.obtainMessage(context.m_nCreateAPResult);
                context.mHandler.sendMessage(msg);
            }
            try {
                Thread.sleep(5L);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
                                                                                                                                                                                                  
    }
                                                                                                                                                                                              
    public void start() {
        try {
            thread = new Thread(this);
            running = true;
            startTime = System.currentTimeMillis();
            thread.start(); //開啓線程
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
                                                                                                                                                                                              
    public void stop() {
        try {
            running = false;
            thread = null;
            startTime = 0L;
        } catch (Exception e) {
            // TODO: handle exception
        }
    }
}
相關文章
相關標籤/搜索