【问题标题】:Check internet connection at runtime在运行时检查互联网连接
【发布时间】:2017-04-28 23:18:12
【问题描述】:

美好的一天,我有一个包含 2 个活动的应用程序:主页面和详细信息页面。

当有互联网连接时,用户可以从主页面导航到详细信息页面。当没有互联网连接时,他不能这样做。

问题是:当我在详情页面并关闭 wifi 时,我想完成这个活动,我该如何实现这个功能? 我已经签入了类似的主要活动类:

 private boolean isNetworkAvailable() {
    ConnectivityManager connectivityManager
            = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
    return activeNetworkInfo != null && activeNetworkInfo.isConnected();
}

无论我在有没有互联网的情况下启动应用程序时,它都可以正常工作,但是当我在运行时关闭 wifi 时,它就不起作用了。

无论如何,谢谢!

【问题讨论】:

  • 只需重新调用isNetworkAvailable()。验证:返回主要活动并尝试重新打开详细信息 - 它可以工作。
  • @FrankN.Stein 我想不关闭并重新启动应用程序,我可以这样做,但对于用户来说,它必须是自动的。我想我需要一些广播接收器,但我不确定
  • 或者只是签入 onResume...
  • @Shmuel on resume 仅在我直接从设置中关闭 wifi 时才有效,但如果我尝试从下拉菜单设置中关闭它则不起作用

标签: android


【解决方案1】:

你必须Monitor for Changes in Connectivity

只要连接详细信息发生更改,ConnectivityManager 就会广播 CONNECTIVITY_ACTION ("android.net.conn.CONNECTIVITY_CHANGE") 操作。您可以在清单中注册广播接收器以侦听这些更改并相应地恢复(或暂停)您的后台更新。

每当互联网状态发生变化时,都会调用您的广播接收器,如果互联网断开连接,您可以相应地进行处理。

public class InternetReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {     

    if (isConnected()) 
        Log.d("NetReceiver", "Internet is connected");  
    else
        Log.d("NetReceiver", "Internet is not connected");    
   }   
};

此方法检查来自所有互联网来源的连接,包括 3g

public boolean isConnected() {

Runtime runtime = Runtime.getRuntime();
try {

    Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
    int exitValue = ipProcess.waitFor();
    return (exitValue == 0);

  } catch (IOException e)          { Log.e("ERROR", "IOException",e); } 
    catch (InterruptedException e) { Log.e("ERROR", "InterruptedException",e); }

return false;
}

在您的清单文件中添加以下内容:

<receiver android:name=".InternetReceiver">
<intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>

这里是Source

【讨论】:

  • 下一步是创建这个类的一个实例(详情页面 onCreate() )并调用 isConnected() 方法?
  • 不,isConnected() 将在互联网状态断开时自动调用.. 你不必做任何事情,这就是BroadcastReceiver 的美妙之处.. 它会在特定事件时触发被称为
【解决方案2】:

您可能希望实现一个广播接收器来监听连接终止事件,以便您可以立即采取行动并完成详细活动。 这个link 可能会有所帮助。

【讨论】:

    【解决方案3】:

    试试这个:

    • 创建一个检查互联网状态或连接的辅助方法
    • 创建线程或可运行对象
    • 在Thread或Runnable的run()内部,调用helper方法
    • 在 MainActivity 的 onCreate() 中,启动 Thread 或 Runnable 以每 n 秒/分钟运行一次

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 2019-08-22
      • 2011-04-15
      • 2017-03-16
      相关资源
      最近更新 更多