Android 动态监听网络变化
2016-09-17 14:06
375 查看
很多时候我们需要对当前手机的网络状态进行判断。
例如:没有网络时打开应用,应该加载缓存数据,不去请求数据等。
当前为wifi网络时,应该加载高清图片,视频自动下载缓存等。
当前为2G网络时,应该停止下载等高流量需求的操作,并提示用户等。
.....
.....
如何监听网络的变化呢?用后台服务是一个很好的选择。既能实时获取当前
Android的网络状态,还能不依赖与
Activity的生命周期。
一.编写服务类
代码注释已经很详细了,主要步骤就是自定义广播实例,并注册系统网络连接的广播(IntentFilter).public class NetworkStateService extends Service { // Class that answers queries about the state of network connectivity. // 系统网络连接相关的操作管理类. private ConnectivityManager connectivityManager; // Describes the status of a network interface. // 网络状态信息的实例 private NetworkInfo info; /** * 当前处于的网络 * 0 :null * 1 :2G/3G * 2 :wifi */ public static int networkStatus; public static final String NETWORKSTATE = "com.text.android.network.state"; // An action name /** * 广播实例 */ private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // The action of this intent or null if none is specified. // action是行动的意思,也许是我水平问题无法理解为什么叫行动,我一直理解为标识(现在理解为意图) String action = intent.getAction(); //当前接受到的广播的标识(行动/意图) // 当当前接受到的广播的标识(意图)为网络状态的标识时做相应判断 if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) { // 获取网络连接管理器 connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); // 获取当前网络状态信息 info = connectivityManager.getActiveNetworkInfo(); if (info != null && info.isAvailable()) { //当NetworkInfo不为空且是可用的情况下,获取当前网络的Type状态 //根据NetworkInfo.getTypeName()判断当前网络 String name = info.getTypeName(); //更改NetworkStateService的静态变量,之后只要在Activity中进行判断就好了 if (name.equals("WIFI")) { networkStatus = 2; } else { networkStatus = 1; } } else { // NetworkInfo为空或者是不可用的情况下 networkStatus = 0; Toast.makeText(context, "没有可用网络!\n请连接网络后刷新本界面", Toast.LENGTH_SHORT).show(); Intent it = new Intent(); it.putExtra("networkStatus", networkStatus); it.setAction(NETWORKSTATE); sendBroadcast(it); //发送无网络广播给注册了当前服务广播的Activity /** * 这里推荐使用本地广播的方式发送: * LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intent); */ } } } }; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); //注册网络状态的广播,绑定到mReceiver IntentFilter mFilter = new IntentFilter(); mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(mReceiver, mFilter); } @Override public void onDestroy() { super.onDestroy(); //注销接收 unregisterReceiver(mReceiver); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } /** * 判断网络是否可用 */ public static boolean isNetworkAvailable(Context context) { // 获取网络连接管理器 ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 获取当前网络状态信息 NetworkInfo[] info = mgr.getAllNetworkInfo(); if (info != null) { for (int i = 0; i < info.length; i++) { if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } } return false; } }
二.启动服务
在Activity中启动服务public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.qzmobile_main); Intent intent = new Intent(); intent.setAction("com.text.service.NetworkStateService"); startService(intent); }
三.注册服务
服务是四大组件之一,当然不能忘记在AndroidManifest.xml中注册服务。
<service android:name="com.text.service.NetworkStateService" > <intent-filter android:priority="1000" > <action android:name="com.text.service.NetworkStateService" /> </intent-filter> </service>
最后不要忘了网络权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
至此,你就能通过自己定义的服务实施监控网络状态了,当网络状态转变的时候,你也对
Activity发出相应要处理的广播即可。
在播放器中,我们常常可以看到这么一个设计,就是用户通过在屏幕的某个部分上下滑动就可以调节屏幕的亮度,在某个部分上下滑动就可以调节播放的音量。而左右滑动就可以调节播放的进度。
今天,我要说一下亮度的调节。其实主要是通过设置View的属性实现的。
[java] view
plain copy
public void onLightChange(float delta, int distance, Window window) {
WindowManager.LayoutParams params = window.getAttributes();
mCurrentDeltaBrintness = mCurrentDeltaBrintness + delta;
if (params.screenBrightness == WindowManager.LayoutParams.BRIGHTNESS_OVERRIDE_NONE) {
params.screenBrightness = getScreenBrightness(getContext());
}
if (Math.abs(mCurrentDeltaBrintness) >= mScrolledPixPerBringhtness) {
float deltaBrightness = mCurrentDeltaBrintness / (mScrolledPixPerBringhtness * MAX_BRINTNESS);
params.screenBrightness = params.screenBrightness + deltaBrightness;
t;pre name="code" class="java"> private void performLightChange(float brightness) {
int resId = R.drawable.light_0;
if (brightness <= 0.01f) {
resId = R.drawable.light_0;
} else if (brightness <= 0.25f) {
resId = R.drawable.light_25;
} else if (brightness <= 0.5f) {
resId = R.drawable.light_50;
} else if (brightness < 1.0f) {
resId = R.drawable.light_75;
} else {
resId = R.drawable.light_100;
}
updateViews(resId, (int) (brightness * 100));
}
if (params.screenBrightness <= 0.01f) { params.screenBrightness = 0.01f; } window.setAttributes(params); mCurrentDeltaBrintness = 0; } performLightChange(params.screenBrightness); }
上述代码就是在左边部分上下滑动的时候会被调用。
另附performLigthChange的代码。
[java] view
plain copy
private void performLightChange(float brightness) {
int resId = R.drawable.light_0;
if (brightness <= 0.01f) {
resId = R.drawable.light_0;
} else if (brightness <= 0.25f) {
resId = R.drawable.light_25;
} else if (brightness <= 0.5f) {
resId = R.drawable.light_50;
} else if (brightness < 1.0f) {
resId = R.drawable.light_75;
} else {
resId = R.drawable.light_100;
}
updateViews(resId, (int) (brightness * 100));
}
我们在举一个相对好切入的例子。
[java] view
plain copy
复制代码
1 package android.lekko.tools;
2
3 import android.app.Activity;
4 import android.content.ContentResolver;
5 import android.provider.Settings;
6 import android.provider.Settings.System;
7 import android.view.WindowManager;
8 import android.widget.Toast;
9
10 public class LightnessControl {
11 // 判断是否开启了自动亮度调节
12 public static boolean isAutoBrightness(Activity act) {
13 boolean automicBrightness = false;
14 ContentResolver aContentResolver = act.getContentResolver();
15 try {
16 automicBrightness = Settings.System.getInt(aContentResolver,
17 Settings.System.SCREEN_BRIGHTNESS_MODE) == Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC;
18 } catch (Exception e) {
19 Toast.makeText(act,"无法获取亮度",Toast.LENGTH_SHORT).show();
20 }
21 return automicBrightness;
22 }
23 // 改变亮度
24 public static void SetLightness(Activity act,int value)
25 {
26 try {
27 System.putInt(act.getContentResolver(),System.SCREEN_BRIGHTNESS,value);
28 WindowManager.LayoutParams lp = act.getWindow().getAttributes();
29 lp.screenBrightness = (value<=0?1:value) / 255f;
30 act.getWindow().setAttributes(lp);
31 } catch (Exception e) {
32 Toast.makeText(act,"无法改变亮度",Toast.LENGTH_SHORT).show();
33 }
34 }
35 // 获取亮度
36 public static int GetLightness(Activity act)
37 {
38 return System.getInt(act.getContentResolver(),System.SCREEN_BRIGHTNESS,-1);
39 }
40 // 停止自动亮度调节
41 public static void stopAutoBrightness(Activity activity) {
42 Settings.System.putInt(activity.getContentResolver(),
43 Settings.System.SCREEN_BRIGHTNESS_MODE,
44 Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
45 }
46 // 开启亮度自动调节
47 public static void startAutoBrightness(Activity activity) {
48 Settings.System.putInt(activity.getContentResolver(),
49 Settings.System.SCREEN_BRIGHTNESS_MODE,
50 Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
51 }
52 }
复制代码
这是一个单独可工作的类,主要用于调节屏幕亮度,有部分注释了,解释几个概念,不标准,供参考:
ContentResolver类,为访问其它应用程序的对外共享数据提供方法,如上面获取、设置亮度时使用的System.getInt(),System.setInt()。
Activity类,android程序的主要类,一个界面必有此类提供后台支持,需要继承此类。
Settings类,android程序系统相关的设置类,各种设置都可在此找。
LayoutParams类,android界面相关的参数,如高度、宽度、亮度等。
Toast类,一个可自动消失的提示框,轻型控件。
好,屏幕的亮度调节就到这里,很简单的。
相关文章推荐
- Android 动态注册监听网络变化实例详解
- Android动态注册广播,监听网络状态变化,判断网络模式
- Android学习——动态注册监听网络变化
- Android开发入门之实现动态注册广播监听网络变化
- Android 第十九课 大喇叭--广播机制----动态注册监听网络变化与静态注册实现开机启动
- Android中动态(在类中)注册广播接收者,监听网络变化
- Android开发之动态注册监听网络变化
- android动态注册广播,监听网络状态变化,判断网络模式
- android动态注册监听网络变化异常
- Android开发动态的监听网络状态的变化
- android--解决方案--用BroadcastReceiver监听手机网络状态变化
- iOS动态监听网络变化
- Android利用广播监听设备网络连接(断网)的变化情况
- android-实时监听网络变化的工具类
- Android利用广播监听设备网络连接(断网)的变化情况
- android网络监听广播遇到网络变化执行多次onRe
- Android 监听网络的变化
- 动态注册广播接收器,监听网络变化
- Android监听WIFI网络的变化并且获得当前信号强度
- 【Android】利用广播BroadCast监听网络的变化