Android零基础入门第36节:Android系统事件的响应
原文:Android零基础入门第36节:Android系统事件的响应
在开发Android应用时,有时候可能需要让应用程序随系统设置而进行调整,比如判断系统的屏幕方向、判断系统方向的方向导航设备等。除此之外,有时候可能还需要让应用程序监听系统设置的更改,对系统设置的更改做出响应。
一、Configuration类
Configuration类专门用于描述手机设备上的配置信息,这些配置信息既包括用户特定的配置项,也包括系统的动态设备配置。程序可调用Activity的如下方法来获取系统的Configuration对象:
Configurationcfg=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.touchscreen + "\n");
status.append("screenLayout:" + cfg.screenLayout + "\n");
status.append("smallestScreenWidthDp:" + cfg.smallestScreenWidthDp + "\n");
status.append("uiMode:" + cfg.uiMode + "\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系统事件的响应先学到这里,更多的内容后续再继续学习。
今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!
此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若需转载请联系作者授权,特此声明!
往期总结分享:
Android零基础入门第1节:Android的前世今生
Android零基础入门第2节:Android 系统架构和应用组件那些事
Android零基础入门第3节:带你一起来聊一聊Android开发环境
Android零基础入门第4节:正确安装和配置JDK, 高富帅养成第一招
Android零基础入门第5节:善用ADT Bundle, 轻松邂逅女神
Android零基础入门第6节:配置优化SDK Manager, 正式约会女神
Android零基础入门第7节:搞定Android模拟器,开启甜蜜之旅
Android零基础入门第8节:HelloWorld,我的第一趟旅程出发点
Android零基础入门第9节:Android应用实战,不懂代码也可以开发
Android零基础入门第10节:开发IDE大升级,终于迎来了Android Studio
Android零基础入门第11节:简单几步带你飞,运行Android Studio工程
Android零基础入门第12节:熟悉Android Studio界面,开始装逼卖萌
Android零基础入门第13节:Android Studio配置优化,打造开发利器
Android零基础入门第14节:使用高速Genymotion,跨入火箭时代
Android零基础入门第15节:掌握Android Studio项目结构,扬帆起航
Android零基础入门第16节:Android用户界面开发概述
Android零基础入门第17节:TextView属性和方法大全
Android零基础入门第18节:EditText的属性和使用方法
Android零基础入门第19节:Button使用详解
Android零基础入门第20节:CheckBox和RadioButton使用大全
Android零基础入门第21节:ToggleButton和Switch使用大全
Android零基础入门第22节:ImageView的属性和方法大全
Android零基础入门第23节:ImageButton和ZoomButton使用大全
Android零基础入门第24节:自定义View简单使用,打造属于你的控件
Android零基础入门第25节:简单且最常用的LinearLayout线性布局
Android零基础入门第26节:两种对齐方式,layout_gravity和gravity大不同
Android零基础入门第27节:正确使用padding和margin
Android零基础入门第28节:轻松掌握RelativeLayout相对布局
Android零基础入门第29节:善用TableLayout表格布局
Android零基础入门第30节:两分钟掌握FrameLayout帧布局
Android零基础入门第31节:少用的AbsoluteLayout绝对布局
Android零基础入门第32节:新推出的GridLayout网格布局
Android零基础入门第33节:Android事件处理概述
Android零基础入门第34节:Android中基于监听的事件处理
Android零基础入门第35节:Android中基于回调的事件处理
Android零基础入门第36节:Android系统事件的响应的更多相关文章
- Android零基础入门第58节:数值选择器NumberPicker
原文:Android零基础入门第58节:数值选择器NumberPicker 上一期学习了日期选择器DatePicker和时间选择器TimePicker,是不是感觉非常简单,本期继续来学习数值选择器Nu ...
- Android零基础入门第59节:AnalogClock、DigitalClock和TextClock时钟组件
原文:Android零基础入门第59节:AnalogClock.DigitalClock和TextClock时钟组件 在前面一期,我们学习了DatePicker和TimePicker,在实际开发中其不 ...
- Android零基础入门第57节:日期选择器DatePicker和时间选择器TimePicker
原文:Android零基础入门第57节:日期选择器DatePicker和时间选择器TimePicker 在实际开发中,经常会遇见一些时间选择器.日期选择器.数字选择器等需求,那么从本期开始来学习And ...
- Android零基础入门第56节:翻转视图ViewFlipper打造引导页和轮播图
原文:Android零基础入门第56节:翻转视图ViewFlipper打造引导页和轮播图 前面两期学习了 ViewAnimator及其子类ViewSwitcher的使用,以及ViewSwitcher的 ...
- Android零基础入门第55节:ImageSwitcher和TextSwitcher使用
原文:Android零基础入门第55节:ImageSwitcher和TextSwitcher使用 上一期我们了解了ViewAnimator组件和ViewSwitcher组件的使用,你都掌握了吗?本期一 ...
- Android零基础入门第54节:视图切换组件ViewSwitcher
原文:Android零基础入门第54节:视图切换组件ViewSwitcher 前面三期学习了ProgressBar系列组件,那本期开始一起来学习ViewAnimator组件. 一.ViewAnimat ...
- Android零基础入门第53节:拖动条SeekBar和星级评分条RatingBar
原文:Android零基础入门第53节:拖动条SeekBar和星级评分条RatingBar 前面两期都在学习ProgressBar的使用,关于自定义ProgressBar的内容后期会继续学习的,本期先 ...
- Android零基础入门第52节:自定义酷炫进度条
原文:Android零基础入门第52节:自定义酷炫进度条 Android系统默认的ProgressBar往往都不能满足实际开发需要,一般都会开发者自定义ProgressBar. 在Android开发中 ...
- Android零基础入门第51节:进度条ProgressBar
原文:Android零基础入门第51节:进度条ProgressBar 不知不觉这已经是第51期了,在前面50期我们学了Android开发中使用频率非常高的一些UI组件,当然这些组件还不足够完成所有AP ...
随机推荐
- 【机器学习实战】第9章 树回归(Tree Regression)
第9章 树回归 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/ ...
- android 连接USB按power键锁屏2声锁屏音
alps\frameworks\base\packages\Keyguard\src\com\android\keyguard\KeyguardViewMediator.java #1384 行左右: ...
- 【物理】概念的理解 —— Phase(相位)
Phase is the position of a point in time (an instant) on a waveform cycle. 相位指的是波形周期中点在某一时刻的位置.Phase ...
- (ubuntu 下)tensorflow 的安装及版本升级
对于 CPU 版本 pip3 install –upgrade tensorflow 对于 GPU 版本: pip3 install –upgrade tensorflow-gpu [TensorFl ...
- 2015-07-30Java 错题
2 推断对错.在java的多态调用中,new的是哪一个类就是调用的哪个类的方法. 正确答案: A 对 错 解析: java多态有两种情况:重载和覆写 在覆写中.运用的是动态单分配.是依据new的类型确 ...
- 【序列操作I】线段树
题目描述 Lxhgww 最近收到了一个 01 序列,序列里面包含了 n(1≤n≤105)个数,这些书要么是 0,要么是 1,现在对这个序列有五种变换操作和询问操作:1. 0 a b ,把[a,b]区间 ...
- 关于js的window.open()
window.open是javascript函数,该函数的作用是打开一个新窗口或这改变原来的窗口,不过一般用来的是打开新窗口,因为修改原来的网页地址,可以有另一个函数,那就是window.locati ...
- iOS 注册或登录页面(UILable,UITextField,UIButton)
注册或登录页面 例如下面的附图 1,为了在这里展示UITextField文本框关联的键盘设置.在这里,"password"和"判定password"关联键盘被设 ...
- Java--面试通关要点
这里,笔者结合自己过往的面试经验,整理了一些核心的知识清单,帮助读者更好地回顾与复习 Java 服务端核心技术.本文会以引出问题为主,后面有时间的话,笔者陆续会抽些重要的知识点进行详细的剖析与解答. ...
- Mybatis使用TypeHandler实现数据的加解密转换
参考: MyBatis之TypeHandler: https://www.cnblogs.com/yulinfeng/p/5991170.html 前段时间收到这么个需求:为安全起见,要求在数据库 ...