如何在 Android 中检测设备状态离线/在线

Posted

技术标签:

【中文标题】如何在 Android 中检测设备状态离线/在线【英文标题】:How to detect device status Offline/Online in Android 【发布时间】:2014-04-15 12:55:14 【问题描述】:

我是 android 的菜鸟。我想在网络仪表板上显示设备状态,无论设备是离线/在线。 GCM 对此是否有帮助,或者我应该为此使用什么。

或者我是否应该连续调用任何 Web API 以将手机状态从手机发送到服务器,直到手机开启,以便我可以在 Web 仪表板上显示手机的“在线”状态?

您的设备处于关闭状态时处于离线状态,而您的设备处于打开状态时处于在线状态

有什么想法吗??

【问题讨论】:

GCM 将在此处工作,只要手机收到 GCM 消息,就会向服务器请求我在线并接收消息,否则会离线 @user1799320 谢谢,这就是我要找的,不错 +1 【参考方案1】:

第 1 步 -> 注册广播接收器以检查设备离线/在线状态。

在Broadcast Receiver的onReceive()方法中,检查网络是否有变化,如果有变化则转到步骤2。

第 2 步 -> 获取设备状态并调用 web api 以及 POST 参数“device_status”。

使用以下 API 获取 Internet 连接状态。

public boolean testNetwork(Context context) 

    ConnectivityManager connManager = (ConnectivityManager) context
            .getSystemService(Context.CONNECTIVITY_SERVICE);
    if ((connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE) != null && connManager
            .getNetworkInfo(ConnectivityManager.TYPE_MOBILE).isConnected())
            || (connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI) != null &&  
            connManager
                    .getNetworkInfo(ConnectivityManager.TYPE_WIFI)
                    .isConnected())) 
        return true;
     else 
        return false;
    


BroadcastReceiver networkStateReceiver = new BroadcastReceiver() 

    @Override
    public void onReceive(Context context, Intent intent) 
        boolean connectivity = CommonUtils.getInstance().testNetwork(
                BaseActivity.this);
        if (!connectivity) 
            // write your code
         else 
            //write your code
        

    
;

IntentFilter filter = new IntentFilter(
            ConnectivityManager.CONNECTIVITY_ACTION);
    try 
        registerReceiver(networkStateReceiver, filter);
     catch (Exception e) 
        e.printStackTrace();
    

【讨论】:

这与我的问题无关。你应该更新你的答案 这里您将描述如何在 android 设备上本地检查网络状态。但是最初的问题的复杂性来自于“web仪表板状态”:服务器如何知道客户端的可用性?【参考方案2】:

使用这个方法: 您不应向服务器发送 ping。服务器应在一段时间后向设备发送 ping,设备应回复。如果设备没有回复,则表示用户处于离线状态。基本上你需要创建与服务器的套接字连接并交换 ping

同样的事情在openfire服务器上实现

【讨论】:

如何暗示这个?假设我有 1000 个用户,我需要向所有人发送“心跳”吗?”以及何时发送?每分钟??,其他聊天应用会立即更新状态!!【参考方案3】:
public boolean isOnline() 
        ConnectivityManager conMgr = (ConnectivityManager) getActivity()
                .getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo netInfo = conMgr.getActiveNetworkInfo();

        if (netInfo == null || !netInfo.isConnected() || !netInfo.isAvailable()) 
            /*
             * Toast.makeText(getActivity(), "No Internet connection!",
             * Toast.LENGTH_LONG).show();
             */
            return false;
        
        return true;
    

然后这样称呼它

if (isOnline()) 
//code if online
 else 
            AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
                    .create();

            alertDialog.setTitle("Info");
            alertDialog
                    .setMessage("Internet Not Available, Cross Check Your Internet Connectivity and Try Again!");
            alertDialog.show();
        

【讨论】:

这与我的问题无关。你应该更新你的答案【参考方案4】:

与任何 Jabber 服务器一起实施 XMPP 协议。 它为您提供正确的信息,因为它是为了制作离线/在线系统而创建的

使用下方链接获取帮助

https://xmpp.org/about/

【讨论】:

以上是关于如何在 Android 中检测设备状态离线/在线的主要内容,如果未能解决你的问题,请参考以下文章

Android : 通过 SERVER 获取在线或离线状态

当用户在Android中使用XMPP离线时向用户发送通知

如何在android应用程序中以在线和离线模式加载或检索网页?

如何检测浏览器是不是在 2018 年离线?

用 JavaScript 检测浏览器在线/离线状态(JavaScript API?—?navigator.onLine)

使用 Android 上的 Smack API 获取在服务器上注册并具有在线/离线状态的所有用户的列表