需求:

webview和js的交互,在离线进入app时,打开显示的页面是A页面,如果这时变成在线了,那么应该自动跳转到B页面;如果本来就是在在线时打开的app,那么久会直接进入B页面,就算此时变成离线,也不会变到A页面。(假如:WebView myWebView,A页面url为AURL,B页面url为BURL)

问题:

js端已写有网络判断,在ios使用时是直接监听就可以,但是android端js写的判断无效,这个问题我也不明白是为什么,所以判断网络这个就落到了android手上。

分析:

网络判断这块内容网上有很多,也就那么几句话而已,但是怎么才能实现自动跳转呢?
两个实现方式: 一、用定时器;二、用广播

判断是否联网:


1 2 3 4 5 6 7 8 910111213141516



public class ConnectNet {
        public static boolean isNetworkConnected(Context context) { 
                // 判断是否联网
                ConnectivityManager cwjManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo info = cwjManager.getActiveNetworkInfo();
                if (info != null && info.isAvailable()) {
                        // 如果联网,返回true
                        return true;
                }
                else {
                        // 不联网,返回false
                        return false;
                }

        }
}


方案一:定时器

handle和Runnable的运用,就可以进行更新页面


1 2 3 4 5 6 7 8 9101112131415161718



Handler handler = new Handler();
// 构建Runnable对象,在runnable中更新页面
Runnable runnable = new Runnable() {
        @Override
        public void run() {
                // 更新页面
                // 如果联网
                if (ConnectNet.isNetworkConnected(context)) {
                        myWebView.loadUrl(AURL);
                        handler.removeCallbacks(this);
                }
                else {
                        myWebView.loadUrl(BURL);
                        handler.postDelayed(this, 2000); // 每两秒执行一次runnable
                }                        
        }
};
handler.post(runnable);


缺点:
用定时器这么更新,会有一个很大的问题,就是因为是每两秒就执行一次,所以会每两秒就刷新一次页面,也就会一直在刷新,因为是loadUrl,所以屏幕就会一直闪,一直再跳动,这个问题没法解决,所以我还是选择用了广播,也是很简单的一种方法,最早朋友提示我也是用这个就好,只是自己太烂了,知道广播怎么写,却不知道怎么把该写的内容加入进去,也是突然之间想到的:

方案二:广播

将主程序中的myWebView设为public static,以便后面之间调用,应该有其他更好的方法的,我就不去写了
然后主程序就只需判断首次登录时的是否联网,进入哪个页面就好:


123456



if (ConnectNet.isNetworkConnected(context)) {
        myWebView.loadUrl(BURL);
}
else {
        myWebView.loadUrl(AURL);
}


然后就是如何写广播啦:


1 2 3 4 5 6 7 8 91011121314151617181920212223242526



public class NetCheckReceiver extends BroadcastReceiver {

        private static final String TAG = "NetCheckReceiver";
        // android 中网络变化时所发的Intent的名字
        public static final String netACTION = "android.net.conn.CONNECTIVITY_CHANGE";

        @Override
        public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub

                if (intent.getAction().equals(netACTION)) {
                        Log.e(TAG, "ACTION:" + intent.getAction());
                        // Intent中ConnectivityManager.EXTRA_NO_CONNECTIVITY这个关键字表示着当前是否连接上了网络
                        // true 代表网络断开  false 代表网络没有断开
                        boolean isBreak = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
                        Log.e(TAG, "is break:" + isBreak);
                        if (isBreak) {
                                Log.d(TAG, "onTeceive:NOT connected, stopping Updaterservice");
                        }
                        else {
                                Log.d(TAG, "onReceive: connected, starting UpdaaterService");
                                context.myWebView.loadUrl(BURL);
                        }
                }
        }
}


好了,这样就完成了,不过一定要记得广播的话要在AndroidManifest里面进行注册:


12345



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


还有判断网络的:


1



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