在运行时检查网络连接

5

你好,我有一个包含两个活动的应用程序:主页面和详情页面。

当有网络连接时,用户可以从主页面导航到详情页面。没有网络连接时,他无法这样做。

问题是:当我在详情页面并关闭wifi时,我希望结束此活动,我该如何实现此功能? 我已经在主活动类中检查了类似以下内容:

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

当我启动应用程序时,无论是否连接互联网都可以正常工作,但是如果在运行时关闭wifi,则无法正常工作。

无论如何,谢谢!


只需重新调用 isNetworkAvailable()。验证:返回主活动并尝试重新打开详细信息 - 它可以工作。 - Phantômaxx
@FrankN.Stein 我想要在不关闭和重新启动应用程序的情况下实现这一点,我可以做到,但对于用户来说必须是自动的。我认为我需要一些广播接收器,但我不确定。 - Vadim L.
或者在 onResume 中检查... - Shmuel
@Shmuel在简历上只有在我直接从设置中关闭Wi-Fi时才有效,但如果我尝试从下拉菜单设置中关闭它,则无效。 - Vadim L.
3个回答

6

您需要监控网络连接状态的改变

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

每当互联网状态更改时,都将调用您的广播接收器,如果Internet断开连接,则可以相应地处理它。

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>

以下是来源


下一步是在详细页面的onCreate()方法中创建该类的实例,并调用isConnected()方法? - Vadim L.
不,只要网络状态断开连接,isConnected() 就会自动调用。你不需要做任何事情,这就是 BroadcastReceiver 的美妙之处。当特定事件被调用时,它将被触发。 - Sharp Edge

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

0

试试这个:

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

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