我正在构建一个Android应用程序,当互联网连接再次处于活动状态时通知用户。他/她必须在互联网不工作时启用该功能。做这个的最好方式是什么?目前我正在运行一个无限循环ping请求谷歌服务,但它没有继续几千个请求后。有没有更简单或更好的方法来实现这一目标?谢谢。
编辑: 大多数答案和参考仅在我的设备连接到Wifi时检查。但是,如果我的设备连接到我的路由器,但互联网连接不起作用怎么办?
答案 0 :(得分:2)
我每次都使用广播检查连接。为连接信息创建一个类。
import android.content.Context;
import android.content.ContextWrapper;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class ConnectivityStatus extends ContextWrapper{
public ConnectivityStatus(Context base) {
super(base);
}
public static boolean isConnected(Context context){
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo connection = manager.getActiveNetworkInfo();
if (connection != null && connection.isConnectedOrConnecting()){
return true;
}
return false;
}
}
将代码应用到您的活动中:
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if(!ConnectivityStatus.isConnected(getContext())){
// no connection
}else {
// connected
}
}
};
在您的活动的onCreate()
方法中注册广播:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.your_layout);
your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
..
...
....
}
不要忘记在活动周期中取消注册/注册:
@Override
protected void onResume() {
super.onResume();
your_activity_context.registerReceiver(receiver, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
}
@Override
protected void onPause() {
super.onPause();
your_activity_context.unregisterReceiver(receiver);
}
答案 1 :(得分:0)
您可以使用广播接收器连续检查互联网可用性。当互联网可用时,Receiver会通知您。
访问此页面,它可以帮助您 :Broadcast receiver for checking internet connection in android app
答案 2 :(得分:0)
为google.com创建一个简单的ping请求,并使用活动中的volley或其他网络库运行后台线程以保持ping。在响应时,检查网络响应代码。如果是服务器错误代码(5xx系列),那么您的互联网将无法使用。如果你得到OK代码(2xx系列),那么你有一个可用的互联网连接。对于这两种情况,请保持500 ms的重试延迟并继续收集网络可用性响应。
或者,使用Android网络管理器。这个类可以实现如下:
public class NetworkConnectivity {
Context context;
private Context _context;
public NetworkConnectivity(Context context){
this._context = context;
}
public boolean isNetworkConnected(){
ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null)
{
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null)
for (int i = 0; i < info.length; i++)
if (info[i].getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
return false;
}
}
从后台线程每隔500毫秒调用isNetworkConnected()
并根据您对连接状态的了解,使用响应(对于连接为true,对于未连接为false)。