响应Android系统的事件
在开发Android应用时,有时候可能需要让应用程序随系统设置而进行调整,比如判断系统的屏幕方向、判断系统方向的方向导航设备等。除此之外,有时候可能还需要让应用程序监听系统设置的更改,对系统设置的更改做出响应。
一、Configuration类
Configuration类专门用于描述手机设备上的配置信息,这些配置信息既包括用户特定的配置项,也包括系统的动态设备配置。程序可调用Activity的如下方法来获取系统的Configuration对象:
Configuration cfg = getResources().getConfiguration();
一旦获得了系统的Configuration对象,就可以使用该对象提供的如下常用属性来获取系统的配置信息。
- densityDpi:屏幕密度。
- fontScale:当前用户设置的字体的缩放因子。
- hardKeyboardHidden:判断硬键盘是否可见,有两个可选值:
- HARDKEYBOARDHIDDEN_NO,值为十六进制的0。
- HARDKEYBOARDHIDDEN_YES,值为十六进制的1。
- keyboard:获取当前关联额键盘类型:该属性的返回值:
- KEYBOARD_12KEY:只有12个键的小键盘。
- KEYBOARD_NOKEYS:无键盘。
- KEYBOARD_QWERTY:普通键盘。
- keyboardHidden:该属性返回一个boolean值用于标识当前键盘是否可用。该属性不仅会判断系统的硬件键盘,也会判断系统的软键盘(位于屏幕)。
- locale:获取用户当前的语言环境。
- mcc:获取移动信号的国家码。
- mnc:获取移动信号的网络码。
- ps:国家代码和网络代码共同确定当前手机网络运营商。
- navigation:判断系统上方向导航设备的类型。该属性的返回值:
- NAVIGATION_NONAV:无导航。
- NAVIGATION_DPAD:DPAD导航。
- NAVIGATION_TRACKBALL:轨迹球导航。
- NAVIGATION_WHEEL:滚轮导航。
- orientation:获取系统屏幕的方向。该属性的返回值:
- ORIENTATION_LANDSCAPE:横向屏幕。
- ORIENTATION_PORTRAIT:竖向屏幕。
- screenHeightDp,screenWidthDp:屏幕可用高和宽,用dp表示。
- touchscreen:获取系统触摸屏的触摸方式。该属性的返回值:
- TOUCHSCREEN_NOTOUCH:无触摸屏。
- TOUCHSCREEN_STYLUS:触摸笔式触摸屏。
- TOUCHSCREEN_FINGER:接收手指的触摸屏。
如果程序需要监听系统设置的更改,则可以考虑重写Activity的onConfigurationChanged (Configuration newConfig)方法,该方法是一个基于回调的事件处理方法:当系统设置发生更改时,该方法会被自动触发。
当然,为了让Activity能监听系统配置更改的事件,需要在配置Activity时指定 androidiconfigChanges 属性,该属性可以支持 mcc、mnc、locale、touchscreen、keyboard、keyboardHidden、navigation、orientation、screenLayout、uiMode、screenSize、smallestScreenSize、fontScale等属性值。
二、示例
接下来通过一个事例程序来学习如何获取设备的系统配置信息,以及如何响应系统设置更改。
同样使用WidgetSample工程,在app/main/res/layout/目录下创建system_event_layout.xml文件,在其中填充如下代码片段:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/configuration_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
为了获取设备的配置信息,以及监听屏幕方向改变的事件,在java包下创建SystemEventActivity.java文件,加载上面新建的布局文件,具体代码如下:
package com.jinyu.cqkxzsxy.android.widgetsample;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import android.widget.Toast;
public class SystemEventActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.system_event_layout);
// 获取界面组件
TextView configurationTv = (TextView) findViewById(R.id.configuration_tv);
// 获取系统的Configuration对象
Configuration cfg = getResources().getConfiguration();
// 获取系统的配置信息
StringBuffer status = new StringBuffer();
status.append("屏幕密度:" + cfg.densityDpi + "n");
status.append("字体缩放因子:" + cfg.fontScale + "n");
status.append("硬键盘是否可见:" + cfg.hardKeyboardHidden + "n");
status.append("键盘类型:" + cfg.keyboard + "n");
status.append("当前键盘是否可用:" + cfg.keyboardHidden + "n");
status.append("语言环境:" + cfg.locale + "n");
status.append("移动信号的国家码:" + cfg.mcc + "n");
status.append("移动信号的网络码:" + cfg.mnc + "n");
status.append("方向导航设备的类型:" + cfg.navigation + "n");
status.append("方向导航设备是否可用:" + cfg.navigationHidden + "n");
status.append("系统屏幕的方向:" + cfg.orientation + "n");
status.append("屏幕可用高:" + cfg.screenHeightDp + "n");
status.append("屏幕可用宽:" + cfg.screenWidthDp + "n");
status.append("系统触摸屏的触摸方式:" + cfg.densityDpi + "n");
status.append("screenLayout:" + cfg.screenLayout + "n");
status.append("smallestScreenWidthDp:" + cfg.densityDpi + "n");
status.append("uiMode:" + cfg.densityDpi + "n");
// 配置信息输出
configurationTv.setText(status.toString());
}
// 重写onConfigurationChanged方法,用于监听系统设置的更改
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 获取更改后的屏幕方向
int screen = newConfig.orientation;
String ori = (Configuration.ORIENTATION_LANDSCAPE == screen) ? "横屏" : "竖屏";
// 消息提示
Toast.makeText(this, "系统的屏幕方向改变为:" + ori, Toast.LENGTH_SHORT).show();
}
}
为了让Activity能监听到屏幕方向的更改事件,需要在配置该Activity时指定 androidiconfigChanges 属性,应用的AndroidManifest.xml文件改为如下形式。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.jinyu.cqkxzsxy.android.widgetsample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".SystemEventActivity"
android:configChanges="orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
上面的配置代码指定了该Activity可以监听屏幕方向改变的事件,这样当程序改变手机屏幕方向时,Activity的onConfigurationChanged()方法就会被回调。
运行程序,可以看到如下图所示系统配置。
在Genymotion模拟器上修改模拟器的屏幕方向,具体操作如下左图所示,当模拟器屏幕方向切换时,可以看到如下右图所示消息提示。
当然如果用真机测试,测试就更方便了。
关于Android系统事件的响应先学到这里,更多的内容后续再继续学习。
- 【精心解读】关于Jupyter Notebook的28个技巧
- Web项目接口自动化测试框架搭建
- 一文读懂Hadoop、HBase、Hive、Spark分布式系统架构
- 《Spring敲门砖之基础教程第一季》 第二章(1) Spring框架之IOC首例-HelloWorld
- Java9中的GC调优基础
- javascript深入理解js闭包
- https连接的前几毫秒发生了什么
- android自定义view实现progressbar的效果
- 还是不靠谱!多维LSTM网络预测比特币价格【机器学习应用区块链系列二】
- picasso图片缓存框架
- Git基础和规范-协同开发
- JavaScript 知识点梳理 | 从基础语法到高级用法
- Java正则速成秘籍(一)之招式篇
- Rafy 框架 - 使用 SqlTree 查询
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Go语言(二十)日志采集项目(二)Etcd的使用
- prometheus入门(一)
- Go语言(十九)日志采集项目之logagent开发(一)
- Go语言(十 八)context&日志项目
- 使用梯度上升欺骗神经网络,让网络进行错误的分类
- Go语言(十七) 配置文件库项目
- Python 相对路径问题:“No such file or directory“
- 基于etcd服务发现的overlay跨多宿主机容器网络
- Go语言(十六) 日志项目升级
- PyQt5 技术篇-设置窗口相对桌面位置,按屏幕比例
- Go语言(十五) 反射
- SpringBoot应用跨域访问解决方案
- Spring Boot 2.2都有哪些新变化
- Go语言(十四)日志项目
- 如何在Spring Boot中使用Cookies