如何检查Android设备是否在线

4

我的服务器不断检查我的安卓应用是否在线。请问我可以在我的安卓应用上采取哪些方式?


在线是什么意思?比如它是否连接到网络? - Bidhan
可能是重复的问题:https://dev59.com/bnI_5IYBdhLWcg3wBuRs - Sami Eltamawy
我们有一台服务器,我想检查我的安卓应用是否正在运行/在线。 - Erwin Daez
2个回答

21
创建一个帮助方法叫做isNetworkAvailable(),根据网络是否可用返回true或false。它会像这样:
private boolean isNetworkAvailable() {
    ConnectivityManager manager =
            (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();
    boolean isAvailable = false;
    if (networkInfo != null && networkInfo.isConnected()) {
        // Network is present and connected
        isAvailable = true;
    }
    return isAvailable;
}
不要忘记将以下权限添加到您的清单文件中。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

编辑:上述方法只检查网络是否可用,而不检查设备是否能够实际连接到互联网。检查是否存在互联网连接的最佳方式是尝试使用HTTP连接到某个已知服务器。

public static boolean checkActiveInternetConnection() {
if (isNetworkAvailable()) {
    try {
        HttpURLConnection urlc = (HttpURLConnection) (new URL("http://www.google.com").openConnection());
        urlc.setRequestProperty("User-Agent", "Test");
        urlc.setRequestProperty("Connection", "close");
        urlc.setConnectTimeout(1500); 
        urlc.connect();
        return (urlc.getResponseCode() == 200);
    } catch (IOException e) {
        Log.e(LOG_TAG, "Error: ", e);
    }
} else {
    Log.d(LOG_TAG, "No network present");
}
 return false;
}

顺便提一下,注意不要在主线程上运行上述方法,否则它会抛出NetworkOnMainThreadException异常。请使用AsyncTask或等效方法。


似乎这个方法只检查网络连接,而不是互联网连接。例如,你可以有一个没有互联网连接的 Wi-Fi。 - Ilya Vorobiev
实际上我想做的是相反的,我有我的服务器,我想检查我的应用程序是否在特定设备上运行/在线。顺便说一句,谢谢您提供的信息。 - Erwin Daez
你应该配置服务器在一定时间间隔后向运行你的应用程序的设备发送 ping,并且该设备应该回复。如果该设备没有回复,这意味着它处于离线状态。 - Bidhan
1
根据文档,NetworkInfo.isConnected()方法“指示是否存在网络连接并且可以建立连接并传递数据。”并且它也保证了“网络是完全可用的”。所以我们真的需要这个额外的checkActiveInternetConnection()方法吗?哪一个是正确的? - Nerdy Bunz
1
请确保使用 https 而不是 http,否则它将无法工作。 - Saurabh Padwekar
显示剩余2条评论

0
public boolean isOnline() {
    ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = connManager.getActiveNetworkInfo();

    if(networkInfo != null && networkInfo.isConnectedOrConnecting()){
     return true;
    } 
    else{
       return false
    }
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接