2009-11-23 162 views
60

我想检查Android手机的网络何时关闭。我可以捕捉该事件吗?网络监听器Android

我没有得到适当的API或任何可以解释相同的示例。如果有人做了或者任何示例链接都会非常有帮助。

回答

144

新的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中新的XML的 “清单” 元素:

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

在AndroidManifest.xml中新的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> 
+0

嘿感谢它按预期工作 – Sam97305421562 2009-11-24 09:56:36

+0

作为@noillusioin说,activeNetInfo可以为空。这表示如果您知道(保存状态)您之前连接了网络连接,则表示网络连接已断开。 – larham1 2013-04-18 21:10:28

+0

您还需要检查NetworkInfo.isConnected – shuriquen 2015-04-18 21:25:21

7

上述答案仅适用于移动分组数据已启用。否则,ConnectivityManager将为空,并且不能再检索NetworkInfo。解决方法是使用PhoneStateListener或TelephonyManager。

16

我一直在使用一个小设置来检查带宽,以确定如何缩放事物,如图像。

下的活性,在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 
} 

这是不是最漂亮的,但它具有足够的灵活性,可以改变项目de的带宽截止值等待他们是什么和我的要求。

+0

找到这个非常有用,谢谢:) – Skynet 2014-02-06 10:15:20

9

如果使用Android Annotations是你在你的活动试试这个选项 - 这一切,产生其余的:

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

使用这个只有当你已经在使用AndroidAnnotations - 把你的项目中这种依赖性只为这段代码会过度杀伤。

+0

你可以请把更多的解释关于这个答案。我试图找到一些东西,但我不能。 Google注释库中没有@Receiver注释。谢谢! – Sniper 2016-02-10 07:39:15

+0

嘿,我指的是第三方库AndroidAnnotations。我更新我的答案。 – 2016-02-11 18:49:22

+0

是的你是对的,有了这个库,它是可能的,我也发现这个https://github.com/jd-alexander/flender检查它不坏,但你只能用它与gradle build 1。3,新版本的gradle插件不起作用 – Sniper 2016-02-11 21:36:58