cocos网络切换通知

android

Java代码

添加类 NetBroadcastReceiver

package com.xiaochan.majiang;

import java.util.ArrayList;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;

public class NetBroadcastReceiver extends BroadcastReceiver {

        private static String NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v("NetBroadcastReceiver", "onReceive");

            if (intent.getAction().equals(NET_CHANGE_ACTION)) {
                Log.v("NetBroadcastReceiver", "net change");

                Native.onNetChange();
            }
        }

}

入口文件

AppActivity.java

    private ConnectionChangeReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ...

        // 监听连接状态
        IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
        myReceiver = new NetBroadcastReceiver();
        this.registerReceiver(myReceiver, filter);
    }


    @Override
    protected void onDestroy() {
        this.unregisterReceiver(myReceiver);
    }

JNI

Java 回调C++的函数


JNIEXPORT void JNICALL Java_com_xiaochan_majiang_Native_onNetChange(JNIEnv* env, jclass method, jstring param)
{
    cocos2d::log("Java_com_xiaochan_majiang_Native_onNetChange");

}

资料

Android实时监听网络状态(2)
http://www.cnblogs.com/zyw-205520/p/3831185.html

iOS

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    ...

    //开启网络状况的监听
    [[NSNotificationCenter defaultCenter] addObserver:self
        selector:@selector(reachabilityChanged:)
        name: kReachabilityChangedNotification
        object: nil];

    // 获取访问指定站点的Reachability对象

    // 把 hostReachable = [Reachability reachabilityWithHostname:@"www.google.com"]; 
    // 改成 hostReachable=[Reachability reachabilityForInternetConnection];
    // 就可以解决
    self.reach = [Reachability reachabilityForInternetConnection];

    // 让Reachability对象开启被监听状态
    [self.reach startNotifier];





- (void)reachabilityChanged:(NSNotification *)note
{

    NSLog(@"reachabilityChanged");

    MissionWeiXin::Instance().onNetChange();

    // // 通过通知对象获取被监听的Reachability对象
    // Reachability *curReach = [note object];

    // // 获取Reachability对象的网络状态
    // NetworkStatus status = [curReach currentReachabilityStatus];

}

问题与解决

官方kReachabilityChangedNotification获取网络变化通知不准确

// 把 hostReachable = [Reachability reachabilityWithHostname:@”www.google.com”]; 改成 hostReachable=[Reachability reachabilityForInternetConnection];就可以了,

资料

kReachabilityChangedNotification 被多次调用
http://www.itstrike.cn/question/eb68162f-ec41-4196-9fec-dabfc2603dc0.html

[ iOS ] 网络监听 - 通知
http://www.jianshu.com/p/806a3857d5f1

扩展

android 下通知多次

http://bbs.csdn.net/topics/390865539
这只是广播,不能只依靠这个来判断,还需要得到当前网络的状态来判断。
通过保存捕获到的状态,在事件改变通知中做判断即可。

posted @ 2017-01-05 18:49  lvye1221  阅读(3)  评论(0编辑  收藏  举报