博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android零基础入门第36节:Android系统事件的响应
阅读量:4514 次
发布时间:2019-06-08

本文共 5173 字,大约阅读时间需要 17 分钟。

   在开发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文件,在其中填充如下代码片段:

    为了获取设备的配置信息,以及监听屏幕方向改变的事件,在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文件改为如下形式。

    上面的配置代码指定了该Activity可以监听屏幕方向改变的事件,这样当程序改变手机屏幕方向时,Activity的onConfigurationChanged()方法就会被回调。 

    运行程序,可以看到如下图所示系统配置。

    在Genymotion模拟器上修改模拟器的屏幕方向,具体操作如下左图所示,当模拟器屏幕方向切换时,可以看到如下右图所示消息提示。

    当然如果用真机测试,测试就更方便了。

    关于Android系统事件的响应先学到这里,更多的内容后续再继续学习。

 

    今天就先到这里,如果有问题欢迎留言一起探讨,也欢迎加入Android零基础入门技术讨论微信群,共同成长!

   此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若需转载请联系作者授权,特此声明!

 

往期总结分享:

Android零基础入门第1节:

Android零基础入门第2节:

Android零基础入门第3节:

Android零基础入门第4节:

Android零基础入门第5节:

Android零基础入门第6节:

Android零基础入门第7节:

Android零基础入门第8节:

Android零基础入门第9节:

Android零基础入门第10节:

Android零基础入门第11节:

Android零基础入门第12节:

Android零基础入门第13节:

Android零基础入门第14节:

Android零基础入门第15节:

Android零基础入门第16节:

Android零基础入门第17节:

Android零基础入门第18节:

Android零基础入门第19节:

Android零基础入门第20节:

Android零基础入门第21节:

Android零基础入门第22节:

Android零基础入门第23节:

Android零基础入门第24节:

Android零基础入门第25节:

Android零基础入门第26节:

Android零基础入门第27节:

Android零基础入门第28节:

Android零基础入门第29节:

Android零基础入门第30节:

Android零基础入门第31节:

Android零基础入门第32节:

Android零基础入门第33节:

Android零基础入门第34节:

Android零基础入门第35节:

转载于:https://www.cnblogs.com/cqkxzsxy/p/7372520.html

你可能感兴趣的文章
js如何实动态删除DIV
查看>>
c++ new 堆 栈
查看>>
该好好学习英语了
查看>>
IPFS的配置安装
查看>>
React Native 安卓 程序运行报错: React Native version mismatch(转载)
查看>>
解决Windows英文版中文软件乱码的问题
查看>>
解决Myeclipse在调试(debug)时无法显示变量值问题
查看>>
android TabActivity(选项卡)的使用!
查看>>
抱怨之1
查看>>
面向对象第四单元(UML)总结
查看>>
FL2440-学习记录(四)
查看>>
C# 温故而知新: 线程篇(四)
查看>>
php解析url并得到url中的参数
查看>>
图说十大数据挖掘算法(一)K最近邻算法
查看>>
Tomcat Context 组件介绍(转载)
查看>>
Unity3d 超级采样抗锯齿 Super Sampling Anti-Aliasing
查看>>
浏览器缓存系列之三:设置浏览器缓存
查看>>
汉明距离
查看>>
差分约束系统
查看>>
SpringCloud实战9-Stream消息驱动
查看>>