Android监听网络变化
最近在做APP,需要监听Android手机网络的变化情况,同时对不同的情况做出不同的响应策略,这里有两种方法。
判断联网工具类
这里我使用的是ConnectivityManager和NetworkInfo两个类来实现的。详细代码如下:
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;/*** Created on 2016/10/31.* 网络状态判断*/
public class NetWorkUtils {public Context context = null;public NetWorkUtils(Context context) {this.context = context;}public static MyApplication getApplication() {return MyApplication.getInstance();}/*** 判断是否联网*/public static boolean isConnectNET(final Context context) {final ConnectivityManager conManage = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);final NetworkInfo networkInfo = conManage.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isAvailable()) {return true;} else {Toast.makeText(context, "断网了,请检查网络~", Toast.LENGTH_SHORT).show();return false;}}
}
自定义BroadcastReceiver
单单使用BroadcastReceiver来实现监听。
源码
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;import com.jiketuandui.antinetfraud.Activity.NetWorkErrorActivity;
import com.jiketuandui.antinetfraud.Util.NetWorkUtils;/*** Created on 2016/10/31.* 使用广播来监听“网络连接”的情况* 当网络连接不存在的时候(断网),NetWorkUtils.isConnectNET(context)* 返回false,这个时候我们就跳转到一个错误提示的Activity中,提示用户联网*/
public class NETChangeReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (!NetWorkUtils.isConnectNET(context)) {intent.setClass(context, NetWorkErrorActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}}
}
注册
1.为了获取上网的权限,和检测网络状态,我们需要添加权限
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
2.在Manifest中配置BroadReceiver监测断网,action里面是网络连接变化时候来触发这个Receiver,如下所示:
<receiver
android:name=".NETChangeReceiver"android:label="NetworkConnection"><intent-filter><action android:name="android.NET.conn.CONNECTIVITY_CHANGE" />intent-filter>
receiver>
这个方法的缺点就是需要在Activity中注册广播,在APP中就不大适用,因为一个Application中不可能只有一个Activity,而且我们也不可能每一个都去注册一边,太麻烦了,所以有了以下的方法。
Service+BroadcastReceiver
上图
主要就是找一个可以独立于众多Activity的载体去承载BroadcastReceiver
,实现对整一个Application的网络监控。
原理
原理其实就是在程序的后台创建一个看不见的服务(Service),在Service中注册一个广播(BroadcastReceiver),当网路发生变化的时候就可以产生一个ConnectivityManager.CONNECTIVITY_ACTION的事件,只要我们监听这个事件就可以实现实时监听网络变化了。
配置权限
- 在AndroidManifest中添加访问网络的权限和监控网络变化的权限
<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- 当然,也不要忘记在中配置一下
<application
android:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" />intent-filter>activity><activity android:name=".NetWorkErrorActivity" /><service
android:name=".NetworkStateService"android:enabled="true" />
application>
源码
- 这里包含了5个文件,NetworkStateService、NetWorkUtils、NetWorkErrorActivity、getConnect和MainActivity
NetworkStateService
package com.notzuonotdied.monitor_network_changes;import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.util.Log;/*** Created by Notzuonotdied on 2016/10/31.* 检测网络的Service服务*/
public class NetworkStateService extends Service {private ConnectivityManager connectivityManager;private NetworkInfo info;private BroadcastReceiver mReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);info = connectivityManager.getActiveNetworkInfo();if (info != null && info.isAvailable()) {String name = info.getTypeName();intent.setClass(context, MainActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);} else {intent.setClass(context, NetWorkErrorActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(intent);}}}};@Overridepublic IBinder onBind(Intent intent) {return null;}/*** 注册BroadcastReceiver* */@Overridepublic void onCreate() {super.onCreate();IntentFilter mFilter = new IntentFilter();mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);registerReceiver(mReceiver, mFilter);}/*** 当被销毁的时候,我们要把BroadcastReceiver注销* */@Overridepublic void onDestroy() {super.onDestroy();unregisterReceiver(mReceiver);}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}
}
NetWorkUtils
package com.notzuonotdied.monitor_network_changes;import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;/*** Created by Notzuonotdied on 2016/10/31.* 网络状态判断*/
public class NetWorkUtils {public Context context = null;public NetWorkUtils(Context context) {this.context = context;}/*** 判断是否联网*/public static boolean isConnectNET(final Context context) {final ConnectivityManager conManage = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);final NetworkInfo networkInfo = conManage.getActiveNetworkInfo();if (networkInfo != null && networkInfo.isAvailable()) {return true;} else {Toast.makeText(context, "断网了,请检查网络~", Toast.LENGTH_SHORT).show();return false;}}}
getConnect
package com.notzuonotdied.monitor_network_changes;import android.support.annotation.Nullable;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;/*** Created by Notzuonotdied on 2016/11/2.* 从客户端获取数据*/
public class getConnect {@Nullablepublic static String doGet(String mURL) throws IOException {HttpURLConnection httpURLConnection;BufferedReader reader = null;StringBuffer stringBuffer = null;try {httpURLConnection = (HttpURLConnection) new URL(mURL).openConnection();httpURLConnection.setRequestProperty("Accept-Charset", "utf-8");// 数据流reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));stringBuffer = new StringBuffer();String line;while ((line = reader.readLine()) != null) {stringBuffer.append(line);}} catch (MalformedURLException e) {e.printStackTrace();} finally {if (reader != null) {reader.close();}}if (stringBuffer == null) {return null;}return stringBuffer.toString();}
}
MainActivity
package com.notzuonotdied.monitor_network_changes;import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import java.io.IOException;/*** 2016年11月2日 09:15:39* */public class MainActivity extends AppCompatActivity {private android.widget.Button btn;private android.widget.TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initService();initView();initListener();}/*** 初始化Service进行监听网络*/private void initService() {Intent i = new Intent(this, NetworkStateService.class);startService(i);}/*** 初始化响应事件*/private void initListener() {btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (NetWorkUtils.isConnectNET(MainActivity.this)) {new getData().execute();}}});}/*** 初始化UI*/private void initView() {this.tv = (TextView) findViewById(R.id.tv);this.btn = (Button) findViewById(R.id.btn);}/*** 为了不让主线程堵塞,影响用户体验,使用异步任务来访问网络*/class getData extends AsyncTask {@Override// 在子线程中doSomethingprotected String doInBackground(Void... voids) {String str = null;try {str = getConnect.doGet("http://www.csdn.com");} catch (IOException e) {e.printStackTrace();}return str;}@Override// 获取数据完成,返回到主线程来更新主线程protected void onPostExecute(String s) {tv.setText(s);super.onPostExecute(s);}}}
NetWorkErrorActivity
- 这里是当网络出现错误的时候,显示错误提示的Activity,这只是个小小的思路,各位看官也可以自己定义成其他的。
package com.notzuonotdied.monitor_network_changes;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;public class NetWorkErrorActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_net_work_error);}
}
源码下载
- 如果觉得不错,可以star下,THX~
- GitHub下载-Monitor_network_changes
附录
- u012062810的专栏 - Android应用程序中用Broadcast来监测”断网”,并进行相应处理
- thinfog - BroadcastReceiver的使用,动态注册和注销,优先级和中断控制
- Crazy Android - android使用两种方式注册receiver
- 短裤党 - 使用Service和BroadcastReceiver实时监听网络状态
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
