ConnectivityManager管理网络状态
在可以使用网络进行任何数据通信之前,你首先需要获得网络的状态,例如,当前网络是否是连通的、是Wi-Fi连接还是GPRS连接还是UMTS等。为了达到这些目的,我们需要使用Android SDK提供的ConnectivityManager类。
为了获得一个ConnectivityManager类的对象,需要使用如下语句:
ConnectivityManager cm = (ConnectivityManager)
(Context.CONNECTIVITY_SERVICE);
一旦得到ConnectivityManager类的对象,我们可以使用它所提供的各种方法和属性来检查网络状态和监听网络状态的变化。
ConnectivityManager常用的方法如下:
(1)public NetworkInfo getActiveNetworkInfo( )
获得当前活动的网络信息。如果当前没有网络是活动的,则返回null。
(2)public NetworkInfo[] getAllNetworkInfo( )
获得系统支持的所有网络类型的信息。
当然,如果要能够获得及监听网络状态的变化,应用程序需要在文件中申请权限
<uses-permissionandroid:name=".ACCESS_NETWORK_STATE"/>
下面我们举一个简单的例子来说明ConnectivityManager的使用。这个例子首先检查当前是否有活动的网络,如有,则打印出这个活动网络的相关信息。运行结果如图所示:
由于程序是在模拟器上运行的,而模拟器的Mobile数据网络是开启的,因此,程序在TextView中显示mobile数据网络是可用的。
创建工程并修改相应文件。修改res/layout/activity_main.xml文件,为其中的TextView组件添加一个id属性。修改后的文件内容如下:
<RelativeLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="." >
<TextView
android:id="@+id/id_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>
再修改文件,修改后的代码如下:
package com.ttt.ex20network01;
import android.support.v7.app.ActionBarActivity;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StringBuffer sb = new StringBuffer();
ConnectivityManager cm = (ConnectivityManager)
this.getSystemService(MainActivity.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getActiveNetworkInfo();
if (ni == null) {
sb.append("当前没有活动网络。");
}
else {
if (ni.isConnected()){
sb.append(ni.getTypeName()).append("是活动的。");
}
else {
sb.append(ni.getTypeName()).append("不在服务区。");
}
}
TextView tv = (TextView)this.findViewById(R.id.id_textview);
tv.setText(sb.toString());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in .
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
在该类的onCreate回调函数中,我们显示界面,并获得ConnectivityManager对象,并调用ConnectivityManager的getActiveNetworkInfo获得当前活动网络的NetworkInfo对象,如果这个函数返回null,则表示当前没有活动的数据网络,否则表示当前有数据网络,但是为了保证网络是可用的,也就是当前网络是可以进行数据通信的,我们进一步调用该NetworkInfo的isConnected方法判断当前网络是否在真正可用,并据此来显示相应信息。
现在运行该程序即可。