【问题标题】:Network listener Android网络监听器 Android
【发布时间】:2010-12-19 11:31:45
【问题描述】:

我想检查 Android 手机网络何时关闭。我可以捕捉那个事件吗?

我没有得到正确的 API 或任何可以解释相同的示例。如果有人做过或任何示例链接将非常有帮助。

【问题讨论】:

    标签: java android networking android-networking


    【解决方案1】:

    新的java类:

    public class ConnectionChangeReceiver extends BroadcastReceiver
    {
      @Override
      public void onReceive( Context context, Intent intent )
      {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE );
        NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo();
        NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(     ConnectivityManager.TYPE_MOBILE );
        if ( activeNetInfo != null )
        {
          Toast.makeText( context, "Active Network Type : " + activeNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
        }
        if( mobNetInfo != null )
        {
          Toast.makeText( context, "Mobile Network Type : " + mobNetInfo.getTypeName(), Toast.LENGTH_SHORT ).show();
        }
      }
    }
    

    AndroidManifest.xml 中“manifest”元素下的新 xml:

    <!-- Needed to check when the network connection changes -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    

    AndroidManifest.xml 中“application”元素下的新 xml:

    <receiver android:name="com.blackboard.androidtest.receiver.ConnectionChangeReceiver"
              android:label="NetworkConnection">
      <intent-filter>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
      </intent-filter>
    </receiver>
    

    【讨论】:

    • 正如@noillusioin 所说,activeNetInfo 可以为空。如果您知道(保存状态)您之前已连接,这表明网络连接刚刚断开。
    • @Eric getNetworkInfo 有替代品吗?因为它已被弃用。
    • @MashukKhan 它是....在 javadoc 中的字面意思是:“此方法在 API 级别 23 中已弃用。此方法不支持相同类型的多个连接网络。使用 getAllNetworks() 和getNetworkInfo(android.net.Network) 代替。”
    • 好的.. 谢谢!!
    • 从 Android 7.0 开始,您无法在 Manifest 中设置 CONNECTIVITY_CHANGE。您需要动态地执行此操作。
    【解决方案2】:

    我一直在使用小型设置来检查带宽以确定如何缩放图像等内容。

    在Activity下,在AndroidManifest中:

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

    在执行检查的活动中:

    boolean network;
    int bandwidth;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        network = isDataConnected();
        bandwidth = isHighBandwidth();
        registerReceiver(new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
                network = isDataConnected();
                bandwidth = isHighBandwidth();
            }
        }, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
        ...
    }
    ...
    private boolean isDataConnected() {
        try {
            ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            return cm.getActiveNetworkInfo().isConnectedOrConnecting();
        } catch (Exception e) {
            return false;
        }
    }
    
    private int isHighBandwidth() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info.getType() == ConnectivityManager.TYPE_WIFI) {
            WifiManager wm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
            return wm.getConnectionInfo().getLinkSpeed();
        } else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
            TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
            return tm.getNetworkType();
        }
        return 0;
    }
    

    一个示例用法是:

    if (network) {
        if (bandwidth > 16) {
            // Code for large items
        } else if (bandwidth <= 16 && bandwidth > 8) {
            // Code for medium items
        } else {
            //Code for small items
        }
    } else {
        //Code for disconnected
    }
    

    这不是最漂亮的,但它提供了足够的灵活性,我可以根据项目的内容和我对它们的要求来更改项目的带宽截止。

    【讨论】:

      【解决方案3】:

      如果您可以选择使用Android Annotations,请在您的活动中尝试此选项 - 仅此而已,其余部分会生成:

      @Receiver(actions = ConnectivityManager.CONNECTIVITY_ACTION,
              registerAt = Receiver.RegisterAt.OnResumeOnPause)
      void onConnectivityChange() {
          //react
      }
      

      仅当您已经使用 AndroidAnnotations 时才使用它 - 将此依赖项放入您的项目中仅为这段代码将是矫枉过正。

      【讨论】:

      • 您能否对这个答案进行更多解释。我试图找到一些东西,但我找不到。谷歌注释库中没有@Receiver 注释。谢谢!
      • 你好,我指的是第三方库AndroidAnnotations。我更新了我的答案。
      • 是的,你说得对,使用这个库是可能的,而且我发现这个github.com/jd-alexander/flender 检查它还不错,但你只能将它与 gradle build 1.3 一起使用,而新的 build gradle 插件则不能工作
      【解决方案4】:

      上述答案仅在启用移动数据包数据时有效。否则,ConnectivityManager 将为空,您无法再检索 NetworkInfo。解决方法是改用 PhoneStateListener 或 TelephonyManager。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        相关资源
        最近更新 更多