zoukankan      html  css  js  c++  java
  • 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 + "
    ");
            status.append("字体缩放因子:" + cfg.fontScale + "
    ");
            status.append("硬键盘是否可见:" + cfg.hardKeyboardHidden + "
    ");
            status.append("键盘类型:" + cfg.keyboard + "
    ");
            status.append("当前键盘是否可用:" + cfg.keyboardHidden + "
    ");
            status.append("语言环境:" + cfg.locale + "
    ");
            status.append("移动信号的国家码:" + cfg.mcc + "
    ");
            status.append("移动信号的网络码:" + cfg.mnc + "
    ");
            status.append("方向导航设备的类型:" + cfg.navigation + "
    ");
            status.append("方向导航设备是否可用:" + cfg.navigationHidden + "
    ");
            status.append("系统屏幕的方向:" + cfg.orientation + "
    ");
            status.append("屏幕可用高:" + cfg.screenHeightDp + "
    ");
            status.append("屏幕可用宽:" + cfg.screenWidthDp + "
    ");
            status.append("系统触摸屏的触摸方式:" + cfg.touchscreen + "
    ");
            status.append("screenLayout:" + cfg.screenLayout + "
    ");
            status.append("smallestScreenWidthDp:" + cfg.smallestScreenWidthDp + "
    ");
            status.append("uiMode:" + cfg.uiMode + "
    ");
    
            // 配置信息输出
            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中基于回调的事件处理

  • 相关阅读:
    16.普通用户、网格长、网格员,操作数据(3)newapp/components/putong.vue
    15.普通用户、网格长、网格员,操作数据(2)newapp/pages/center/center.vue
    14.普通用户、网格长、网格员,操作数据(1)后端部分
    13.需求:在后台可以控制网格长和网格员在小程序端对数据的编辑权限
    Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触
    Asp.Net Core 3.1 获取不到Post、Put请求的内容 System.NotSupportedException Specified method is not supported
    [Hei.Captcha] Asp.Net Core 跨平台图形验证码实现
    基于IdentityServer4的OIDC实现单点登录(SSO)原理简析
    ASP.NET Core Swagger接入使用IdentityServer4 的 WebApi
    ASP.NET Core 使用 Google 验证码(reCAPTCHA v3)代替传统验证码
  • 原文地址:https://www.cnblogs.com/cqkxzsxy/p/7372520.html
Copyright © 2011-2022 走看看