簡體   English   中英

互聯網狀態更改事件通知Android

[英]Internet status change Event Notification Android

我正在開發一個應用程序,只要有互聯網連接,就可以在其中發送消息。 連接管理器僅提供WiFi /移動連接狀態。 我可以ping任何站點以檢查Internet連接。 這意味着我需要不斷輪詢。 由於網絡覆蓋范圍不佳或網絡連接性不佳(WiFi回傳),是否可以通過任何方式通知活動恢復連接?

在此先感謝您的幫助。

我相信這對您會有所幫助。 如何在Android上檢查互聯網訪問? InetAddress永不超時 最佳解決方案描述了兩個選項。

希望這會有所幫助!

我曾經需要這樣的解決方案。 因此,我精心設計了一個類,可以利用此站點中的代碼來解決問題。 我們將此類iChessNetwork

import android.content.*;
import android.net.*;
import android.net.wifi.*;
import android.os.*;
import android.widget.*;
import java.io.*;
import java.net.*;

public class iChessNetwork {

private Context mContext;
protected Watcher mWatcher;

public iChessNetwork(Context context, Watcher watcher) {
    mContext = context;
    mWatcher = watcher;
    init();
} 
public interface Watcher {
    public void Online();
}

private void init() {
    registerOnlineChecker();
}
public void stop() {
    unregisterOnlineChecker();
}

/*=========:INTERNET CHECK START ========*/
private BroadcastReceiver mOnlineChecker = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (isConnected()) {
            //Toast.makeText(mContext,"You are connected!",Toast.LENGTH_LONG).show();
            OnlineTester mOnlineTester = new OnlineTester();
            mOnlineTester.execute();
        }
    }
};

private void registerOnlineChecker() {
    IntentFilter filter = new IntentFilter();
    filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
    filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
    mContext.registerReceiver(mOnlineChecker, filter);
}

private void unregisterOnlineChecker() {
    mContext.unregisterReceiver(mOnlineChecker);
}

private boolean isConnected() {
    boolean isMobile = false, isWifi = false;

    ConnectivityManager cm = (ConnectivityManager)mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo[] infoAvailableNetworks = cm.getAllNetworkInfo();

    if (infoAvailableNetworks != null) {
        for (NetworkInfo network : infoAvailableNetworks) {

            if (network.getType() == ConnectivityManager.TYPE_WIFI) {
                if (network.isConnected() && network.isAvailable())
                    isWifi = true;
            }
            if (network.getType() == ConnectivityManager.TYPE_MOBILE) {
                if (network.isConnected() && network.isAvailable())
                    isMobile = true;
            }
        }
    }

    return isMobile || isWifi;
}


/*========= INTERNET CHECK END ==========*/


private class OnlineTester extends AsyncTask<Void,Void,Boolean> {

    public OnlineTester() {

    }

    @Override
    protected Boolean doInBackground(Void[] p1) {
        boolean online = false;
        try {
            HttpURLConnection urlConnection = (HttpURLConnection)
                (new URL("http://clients3.google.com/generate_204")
                .openConnection());
            urlConnection.setRequestProperty("User-Agent", "Android");
            urlConnection.setRequestProperty("Connection", "close");
            urlConnection.setConnectTimeout(1500);
            urlConnection.connect();
            if (urlConnection.getResponseCode() == 204 &&
                urlConnection.getContentLength() == 0) {
                //Log.d("Network Checker", "Successfully connected to internet");
                online = true;
            }
        } catch (IOException e) {
            online = false;
        }
        return online;
    }

    @Override
    protected void onPostExecute(Boolean online) {
        // TODO: Implement this method
        super.onPostExecute(online);
        if(online) {
            if(mWatcher != null) {
                mWatcher.Online();
            }
        }
    }
 }
};

您可能會注意到,該類中有一個接口。 基本上,我想知道,如果“活動”的網絡連接是否可用從我的一個Activity類。 因此,我在該Activity實現了以上interface ,如下所示:

public class YourActivity extends Activity implements iChessNetwork.Watcher {

private iChessNetwork mNetwork;

@Override
public void Online() {
    // It's online now - do your connection

}

現在,我們已經准備好出發了。 因此,我讓它從Activity類的某個位置(通常在android應用程序的起點onCreate()運行:

mNetwork = new iChessNetwork(this, this);

我開始跟蹤從這點“活躍”的互聯網連接,並停止跟蹤時,我不希望它(通常,在onBackPressed()onDestroy()我的方法Activity是這樣的:

    if(mNetwork != null) {
        mNetwork.stop();
    }

希望這對您和其他人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM