Android零基础入门第36节:Android系统事件的响应

简介: 原文:Android零基础入门第36节:Android系统事件的响应   在开发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中基于回调的事件处理

            目录
            相关文章
            |
            3月前
            |
            人工智能 搜索推荐 物联网
            Android系统版本演进与未来展望####
            本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
            |
            3月前
            |
            IDE Java 开发工具
            移动应用与系统:探索Android开发之旅
            在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
            |
            2月前
            |
            监控 Java Android开发
            深入探索Android系统的内存管理机制
            本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
            |
            2月前
            |
            存储 安全 Android开发
            探索Android系统的最新安全特性
            在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
            |
            3月前
            |
            监控 Java Android开发
            深入探讨Android系统的内存管理机制
            本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
            118 16
            |
            3月前
            |
            安全 Android开发 iOS开发
            深入探讨Android与iOS系统的差异及未来发展趋势
            本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
            |
            3月前
            |
            算法 JavaScript Android开发
            |
            3月前
            |
            安全 搜索推荐 Android开发
            揭秘安卓与iOS系统的差异:技术深度对比
            【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
            218 2
            |
            3月前
            |
            安全 搜索推荐 程序员
            深入探索Android系统的碎片化问题及其解决方案
            在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。
            |
            3月前
            |
            安全 Android开发 iOS开发
            深入探索iOS与Android系统的差异性及优化策略
            在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。

            热门文章

            最新文章

          1. 1
            如何修复 Android 和 Windows 不支持视频编解码器的问题?
          2. 2
            【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
          3. 3
            当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
          4. 4
            【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
          5. 5
            APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
          6. 6
            【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
          7. 7
            Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
          8. 8
            【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
          9. 9
            android之ListView和SimpleAdapter的组合使用
          10. 10
            安卓逆向系列教程 4.1 字符串资源
          11. 1
            APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
            50
          12. 2
            【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
            29
          13. 3
            当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
            69
          14. 4
            【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
            91
          15. 5
            Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
            29
          16. 6
            如何修复 Android 和 Windows 不支持视频编解码器的问题?
            242
          17. 7
            【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
            62
          18. 8
            【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
            35
          19. 9
            【03】优雅草央千澈详解关于APP签名以及分发-上架完整流程-第三篇安卓APP上架华为商店后面的步骤-华为应用商店相对比较麻烦一些-华为商店安卓上架
            52
          20. 10
            app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
            84