安卓:Activity建立网络连接

3
我有一个Activity,它在onCreate方法中从Web上查找数据。用户按下通知时会激活该Activity。因此,这是一个常见的问题,即用户将迅速打开手机,解锁它,滑动打开通知,点击通知,而Activity将在手机完成连接到Internet之前激活。
我确实有一个友好的AlertDialog弹出窗口,告知用户无法收到数据,并在网络连接后再试一次。但是,有没有一种方法让Activity主动告诉手机连接并检测正在进行连接,然后等待连接建立,然后成功加载其数据呢?
2个回答

4
通常情况下,您需要执行以下操作:
@Override
public void onResume(){
    super.onResume();
    // first, check connectivity
    if ( isOnline ){
        // do things if it there's network connection
    }else{
        // as it seems there's no Internet connection
        // ask the user to activate it
        new AlertDialog.Builder(YourActivity.this)
            .setTitle("Connection failed")
            .setMessage("This application requires network access. Please, enable " +
                    "mobile network or Wi-Fi.")
            .setPositiveButton("Accept", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // THIS IS WHAT YOU ARE DOING, Jul
                    YourActivity.this.startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS));
                }
            })
            .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    YourActivity.this.finish();
                }
            })
            .show();
    }
}

这个想法是要求用户去配置一个网络连接。然后,如果用户确实想要进行配置,你将调用 Settings.ACTION_WIRELESS_SETTINGS 意图。

此外,请注意 isOnline 变量,它是一个布尔值,告诉我们是否有网络连接。为了设置这个变量,您可以使用一个外部的简单类,如下所示:

public class CheckConnectivity {
    public static boolean isOnline(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        if( cm == null )
            return false;
        NetworkInfo info = cm.getActiveNetworkInfo();
        if( info == null )
            return false;
        return info.isConnectedOrConnecting();
    }
}

另外,您需要将此权限添加到您的AndroidManifest.xml文件中:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2
这可能会让已经启用了WiFi和3G的用户感到困惑,因为互联网还没有可用。在我的例子中,我的手机启用了WiFi无线电,但我设法在WPA2握手完成之前启动了我的Activity。几分钟后,我重新启动我的Activity,它没有问题,因为WiFi链接已经建立;但我想能够检测到WiFi链接正在尝试连接,并等待它连接。 - Ricket

2
从Cristian的最后一句话“return info.isConnectedOrConnecting();”可以看出,你可以根据该方法返回的布尔值对活动进行任何想要的操作。 由于你所需要的是一个肯定的返回值,因此你可以使用它的变量来回调你活动的下一个动作。

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