zoukankan      html  css  js  c++  java
  • Android: 网络随时需要在3G和Wifi切换,网络程序需要注意

    平时,3G和WIFI 都开着的时候,Android默认使用Wifi,但现实环境中不可能到处都有wifi,所以手机会经常自动切换网络。

    有的时候,手机一开始使用wifi上网,当进入待机后10-30分钟,会自动从Wifi切换到3G网络。

    如果编写网络程序,网络自动切换对程序的影响是非常明显的,IP地址肯定会变化。

    感觉Android环境与我们日常用的windows环境还是有很大不同的,写Android程序,明显需要注意的细节有很多。

    ------------------------------------------------------------------------------------------------------------------------------------------------

    下面附上相关的一些代码:
    //listen 网络连接状态:  全部断开,当前正在使用Wifi网络,当前正在使用mobile网络,这个主要用于数据通讯时使用的线路判断

    UpdateReceiver  receiver = new UpdateReceiver();

    filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

    registerReceiver(receiver, filter); //注册,开始接听广播

    //接收来自Service的广播消息
     class UpdateReceiver extends BroadcastReceiver
     {
      private int previousNetType = -1;

      @Override
      public void onReceive(Context context, Intent intent)
      {
       //System.out.println("接收到的广播信息:" + intent + "------" + intent.getExtras());

       String action = intent.getAction();

    if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION))
       {
        //listen:网络状态已变化 -> 断网 or 移动网络上线 or wifi网络上线 or 移动网络与wifi切换  
        //通过 intent.getExtras() 能提到详细的网络变化参数信息

        //ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        //NetworkInfo mobileNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        //NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

        NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); //当前的
        NetworkInfo otherNetworkInfo = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager.EXTRA_OTHER_NETWORK_INFO); //另一个网络状态

        boolean hasNoConnected = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); //检查是否网络全部断开  
        boolean isFailover = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); //是不是wifi 和 3g在切换 | 故障转移   
        //String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON);  //原因,因什么而change

        if (hasNoConnected)
        {
         previousNetType = -1;

         isNetOnLine = false;

         if (currentFriend != null)
         {
          addSystemTipToTalk("网络已断开,你已离线.", currentFriend.getNumber());
         }

         //如果手机之前是通过wifi上网,同时关闭了3G数据网络,当进入锁屏后,可能是几分钟时间,android一般会自动关闭wifi连接,需要声音提示
         if (activityIsStoped || mKeyguardManager.inKeyguardRestrictedInputMode())
         {
          showNotify(A.ID_NOTIFY_GOING, getResources().getString(R.string.app_name), "网络已断开,你已离线.", "网络已断开,你已离线.", R.drawable.ic_stat_logo,
            Notification.FLAG_NO_CLEAR);
         }
         else
         {
          showSystemTip("网络已断开,你已离线.");
         }
        }
        else
        {
         isNetOnLine = true;

         if (isFailover || otherNetworkInfo == null)
         {
          if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
          {
           if (previousNetType != ConnectivityManager.TYPE_WIFI && networkInfo.isConnected())
           {
            previousNetType = ConnectivityManager.TYPE_WIFI;

            if (currentFriend != null)
            {
             addSystemTipToTalk("WIFI网络已启用.", currentFriend.getNumber());
            }

            showSystemTip("WIFI网络已启用");

            //由于刚刚切换网络,不能马上发送数据,等几秒后再发,比较可靠
            new Thread(new Runnable() {
             public void run()
             {
              try
              {
               Thread.sleep(2000);
              }
              catch (InterruptedException e)
              {
              }
              sendBroadcast(XinTiaoService.INTENT_XINTIAO); //通知服务器,我切换了网络
             }
            }).start();

           }
          }
          else
          {
           if (previousNetType == ConnectivityManager.TYPE_WIFI || previousNetType == -1)
           {
            if (networkInfo.isConnected())
            {
             previousNetType = ConnectivityManager.TYPE_MOBILE;

             if (currentFriend != null)
             {
              addSystemTipToTalk(networkInfo.getSubtypeName() + "网络已启用.", currentFriend.getNumber());
             }

             showSystemTip(networkInfo.getSubtypeName() + "网络已启用");

             //由于刚刚切换网络,不能马上发送数据,等几秒后再发,比较可靠
             new Thread(new Runnable() {
              public void run()
              {
               try
               {
                Thread.sleep(2000);
               }
               catch (InterruptedException e)
               {
               }
               sendBroadcast(XinTiaoService.INTENT_XINTIAO); //通知服务器,我切换了网络
              }
             }).start();
            }
           }
          }
         }

    2011-11-27

  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/personnel/p/4583135.html
Copyright © 2011-2022 走看看