当前位置: 首页 > news >正文

android系统新特性——用户界面以及系统界面改进

用户界面改进

Android用户界面改进最明显的就是MD了。MD是Google于2014年推出的设计语言,它是一套完整的设计系统,包含了动画、样式、布局、组件等一系列与设计有关的元素。通过对这些行为的描述,让开发者设计出更符合目标的软件,同时对这些软件的功能也更易于用户的理解。除此之外,还有另外两个用户界面方面的改进,包括:

  • 多窗口功能
  • App Shortcuts

多窗口功能

在Android7之前的版本上,所有activity都是全屏的,如果不设置透明效果,一次只能看到一个activity的界面。但是从Android7开始,系统支持了多窗口的功能。在有了多窗口支持之后,用户可以同时打开和看到多个应用的界面。这对于用户来说,是非常方便的。

Android上的多窗口功能有下面3种模式。

  • 二分屏模式
    这种模式主要在手机上使用。该模式将屏幕一分为二,同时显示两个应用的界面。屏幕中间是一条可以移动调整窗口大小的分隔线。
    在这里插入图片描述

  • 画中画模式
    这种模式主要在TV上使用,在该模式下,某个应用的界面(通常是视频播放类应用)以一个小的浮动窗口形式在屏幕上显示。在Android8上,系统支持在tv之外的设备上使用这一功能。例如,手机上的视频聊天软件可以利用这一功能。

  • Freeform模式
    这种模式类似于常见的桌面操作系统,窗口可以自由拖动和修改大小。但这一功能,在手机设备上,使用起来不是很方便,因此系统上没有提供直接打开这一功能的入口。Android7上,想要打开这一功能,需要借助命令行。
    将设备连上pc之后,执行以下两条adb命令即可打开freeform模式:
    (1)adb shell settings put global enable_freeform_support 1。
    (2)然后重启手机:adb reboot。
    重启之后,在近期任务界面会出现一个按钮,这个按钮可以将窗口切换到freeform模式。可能在有些手机上会报权限错误,这个大家可以Google下如何解决。

开发者相关

生命周期

多窗口不影响和改变原先activity的生命周期。
在多窗口模式下,多个activity可以同时可见,但只有一个activity是resumed状态。所有其他activity都会处于paused状态(尽管它们是可见的)。
在以下三种场景下,系统会通知应用有状态变化,应用可以进行处理:

  • 当用户以多窗口的模式启动的应用
  • 当用户改变了activity的窗口大小
  • 当用户将应用窗口从多窗口模式改为全屏模式

Manifest新增属性

AndroidManifest.xml中新增了下面两个属性来进行多窗口的控制。

  • android:resizeableActivity=[“true”|“false”]
    这个属性可以用在activity或者application中。如果该属性设置为true,activity将能以分屏和自由形状模式启动。如果此属性设置为false,activity将不支持多窗口模式。如果该值为false,且用户尝试在多窗口模式下启动activity,该activity将全屏显示。对于api目标level为24或更高级别的应用来说,这个值默认是true。

  • android:supportsPictureInPicture=[“true”|“false”]
    这个属性用在activity上,表示该activity是否支持画中画模式。如果android:resizeableActivity=false,这个属性值将被忽略。

Layout新增属性

除了AndroidManifest.xml,在layout文件中,也新增了一些属性来进行相应的控制。

  • android:defaultWidth、android:defaultHeight指定了freeform模式下的默认宽度和高度
  • android:gravity指定了freeform模式下的初始gravity
  • android:minWidth、android:minHeight指定了分屏和freeform模式下的最小高度和宽度。如果用户在分屏模式中移动分界线,使activity尺寸低于指定的最小值,系统会将activity剪裁为用户请求的尺寸。
 <activityandroid:supportsPictureInPicture="true"android:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><layout android:defaultHeight="500dp"android:gravity="top|end"android:minHeight="450dp"android:minWidth="300dp"android:defaultWidth="600dp"></layout></activity>
package com.mvp.myapplication;import androidx.appcompat.app.AppCompatActivity;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;import com.mvp.myapplication.databinding.ActivityMainBinding;public class MainActivity extends AppCompatActivity {// Used to load the 'myapplication' library on application startup.static {System.loadLibrary("myapplication");}private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);binding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(binding.getRoot());// Example of a call to a native methodTextView tv = binding.sampleText;tv.setText(stringFromJNI());//        Android7上还增加了下面这些api:
//        this.isInMultiWindowMode()//查询是否处于多窗口模式
//        this.isInPictureInPictureMode()//查询是否处于画中画模式
//        this.onMultiWindowModeChanged();//多窗口模式变化时进行通知(进入或退出多窗口)
//        this.onPictureInPictureModeChanged();//画中画模式变化时进行通知(进入或退出画中画模式)this.enterPictureInPictureMode();//进入画中画模式,如果系统不支持,这个调用无效}/*** A native method that is implemented by the 'myapplication' native library,* which is packaged with this application.*/public native String stringFromJNI();
}

至于多窗口功能的实现主要依赖于ams和wms这两个系统服务,它们都位于system_server进程中。前者负责所有activity的管理,后者负责所有窗口的管理(不仅activity具有窗口,其他模块也会有窗口,例如,输入法)。ams和wms需要配合一起工作,因为无论是创建还是销毁activity都涉及activity对象和窗口对象的创建和销毁。

App Shortcuts

App Shortcuts是Android7.1上推出的新功能。借助于这项功能,应用程序可以在launcher中放置一些常用的应用入口以方便用户使用。
每个shortcut可以对应一个或者多个intent,它们各自会通过特定的intent来启动应用程序,例如:

  • 对于一个地图应用,可以提供一个shortcut导航用户至某个特定的地点
  • 对于一个通信应用,可以提供一个shortcut来发送消息给好友
  • 对于一个视频应用,可以提供一个shortcut来播放某个电视剧

当一个shortcut包括了多个intent时,用户的一次点击会触发所有这些intent,其中的最后一个intent决定了用户所看到的结果。

开发者API

使用shortcuts有两种方式。

  • 动态形式:在运行时,通过ShortcutManager API来进行注册。通过这种方式,可以在运行时,动态地发布、更新和删除shortcut。
  • 静态形式:在apk中包含一个资源文件来描述shortcut。这种注册方法将导致:如果要更新shortcut,必须更新整个应用程序。
    目前,每个应用程序最多可以注册4个shortcuts,无论是动态形式还是静态形式。

具体用户,读者可以参考下面这篇博客:https://www.jianshu.com/p/6b6f79096256

系统界面改进

系统界面属于系统的一部分。系统上方的status bar,以及下方的navigation bar都属于系统界面。除此之外,近期任务界面、锁屏也都是属于系统界面。可见,系统界面是用户交互最多的ui元素。

systemUI整体介绍

AOSP源码中,包含了两类Android应用程序:

  • 一类是系统的内置应用,这些应用提供了手机的基本功能。包括launcher、系统设置、电话、相机等。它们位于/packages/apps/目录下。理论上,这些应用都是可以被第三方应用所替代的,例如:我们完全可以安装一个第三方的电话、相机,而不使用系统的,这也是Android系统最为灵活的地方(注意:系统设置通常无法被第三方应用替代,因为它使用了一些拥有非常高权限的内部api。为了保证系统安装,这些api很多不会对外开放)。
  • 另外一类应用,则是属于framework的一部分,这些应用是无法被第三方应用所替代的。它们位于/frameworks/base/packages目录下,包括了systemUI、VpnDialogs等。

整个systemUI 由一个application的子类systemUIApplication进行初始化,application对应了整个应用程序的全局状态。系统会保证,application对象一定是应用程序中第一个实例化的对象。并且,application的oncreate方法一定早于应用中所有的activity、service、broadcastreceiver(但是不包含contentProvider)创建之前被调用。
systemUIApplication负责了所有systemUI组件的初始化,这其中就包含了最常见的system Bar(status Bar和navigation Bar合称为system Bar)。
system Bar虽然是系统的一部分,但是为了让应用能够提供更好的用户体验,系统提供了接口来进行控制。开发者可以根据需要来显示或隐藏status bar和navigation bar(它们中两者之一或者全部)。

三种模式
对于system bar的控制,Android系统定义了三种场景模式:

  • Lights Out模式
    这是Android4.4之前版本上的模式,这种模式的行为是:当用户几秒钟内没有操作的情况下,action bar和status bar会被淡化成不可用状态。但是navigation bar是正常可用的,虽然它会被dim。如果在4.4之后的版本上开发,考虑下面这两种模式。
  • Lean Back模式
    在这种模式下,system bar虽然是隐藏的,每当用户轻触屏幕时,它们会重新显示出来变成可用。因此,这种模式适合于用户无须频繁交互的应用,例如播放视频。
  • Immersive模式
    在这种模式下,只有当用户从屏幕边缘滑向屏幕中间时,system bar才会显示出来。因此这种模式适用于需要频繁交互但用户不太需要system bar的应用。例如,全屏游戏或者画图软件。

api与使用场景
https://www.jianshu.com/p/7de7bcf604b0

沉浸式全屏
Android4.4引用了一个新的flag:SYSTEM_UI_FLAG_IMMERSIVE。使用这个flag可以使你的应用获得真正的全屏。当这个flag与SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN组合起来使用时,会隐藏整个system bar使得应用获取整个屏幕的触摸事件。
由于应用接受了全部的触摸事件,只有当用户从屏幕边缘往内部滑动时,system bar才会显示出来。这样会清除SYSTEM_UI_FLAG_HIDE_NAVIGATION(如果设置了SYSTEM_UI_FLAG_FULLSCREEN也会被清除)。如果希望system bar在这之后再次自动隐藏起来,可同时设置SYSTEM_UI_FLAG_IMMERSIVE_STICKY。

提醒气泡:
当应用程序中首次进入沉浸式模式时,系统会显示提醒气泡。提醒气泡用于提醒用户如何显示系统栏。

非沉浸式模式:
这是应用程序在进入沉浸式模式之前出现的状态。除此之外,如果使用了SYSTEM_UI_FLAG_IMMERSIVE标志,并且当用户从屏幕边缘往内部滑动时,此时会清除SYSTEM_UI_FLAG_HIDE_NAVIGATION和SYSTEM_UI_FLAG_FULLSCREEN标志。清除这些标志后,system bar将重新出现并保持可见,此时也会是这样。请注意,最好的做法是将所有UI控件与系统栏保持同步,以最大限度地减少屏幕地状态数量,从而提供更加无缝地用户体验。所以这里所有的UI控件都与状态栏一起显示。一旦应用程序进入沉浸式模式,UI控件将于系统栏一起隐藏。为了确保UI可视性与系统栏可见性保持同步,可通过View.OnSystemUiVisibilityChangeListener来响应UI改变事件。

沉浸式模式:
系统栏和其他UI控件被隐藏。可以使用SYSTEM_UI_FLAG_IMMERSIVE_STICKY或SYSTEM_UI_FLAG_IMMERSIVE标志来实现此状态。

响应System UI的改变事件
在system bar隐藏或显示之后,应用自身的UI也可能需要做一些改变。并且,保持这两者的状态同步时一个很好的做法。
如果应用想要关心system ui的变更事件,只需要设置一个监听即可。例如,可以在activity的oncreate方法完成这个监听

  View decorView = getWindow().getDecorView();decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {@Overridepublic void onSystemUiVisibilityChange(int visibility) {//只有在LOW_PROFILE、HIDE_NAVIGATION和FULLSCREEN都没有设置的时候,system bar才是可见的if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN)==0){//system bar可见时,例如显示action bar或者导航相关的控件}else{//system bar不可见时 例如隐藏action bar或者导航相关的控件}}});

相关文章:

android系统新特性——用户界面以及系统界面改进

用户界面改进 Android用户界面改进最明显的就是MD了。MD是Google于2014年推出的设计语言&#xff0c;它是一套完整的设计系统&#xff0c;包含了动画、样式、布局、组件等一系列与设计有关的元素。通过对这些行为的描述&#xff0c;让开发者设计出更符合目标的软件&#xff0c…...

电量计驱动代码

外部电量计驱动代码,直接上代码了,懒,不做细节分析。。。。。 /** Fuelgauge battery driver** This package is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Soft…...

如何将音频添加到视频并替换视频中的音轨

随着视频流媒体网站的流行和便携式设备的发展&#xff0c;你可能越来越倾向于自己制作视频并在互联网上分享。有时&#xff0c;你可能还需要编辑视频并为其添加背景音乐&#xff0c;因为音乐总是对视频的感知起着神奇的作用。 那如何给视频添加音频呢&#xff1f;或者如何用新…...

Android 单元测试初体验

Android 单元测试初体验 前言一、单元测试是什么&#xff1f;二、简单使用1.依赖2.单元测试代码简单模版及解释 总结 前言 当初在学校学安卓的时候&#xff0c;老师敢教学进度&#xff0c;翻到单元测试这一章节的时候提了两句&#xff0c;没有把单元测试当重点讲&#xff0c;只…...

HarmonyOS—ArkTS中@Observed和@ObjectLink装饰器的嵌套类对象属性变化【鸿蒙应用开发】

文章目录 ARKTS中@Observed和@ObjectLink装饰器的嵌套类对象属性变化@Observed 类装饰器说明装饰器参数类装饰器的使用@ObjectLink 变量装饰器说明装饰器参数同步类型允许装饰的变量类型被装饰变量的初始值举例装饰器的限制条件观察变化和行为表现观察的变化框架行为使用场景1.…...

设计问卷调查问题的技巧二:确定问题的结构与顺序

上篇文章中&#xff0c;我们了解到设计问卷调查问卷的技巧有保持问题中立、少用开放式问题、保持全名平衡的答案集、谨慎设置单一回答。在这篇文章中&#xff0c;我们将继续深入探讨设计问卷调查问题的剩余5大技巧&#xff01; Tip5&#xff1a;注意问题的顺序 虽然您可以任意…...

kubernetes使用nfs创建pvc部署mysql stateful的方法

kubernetes创建的pod默认都是无状态的&#xff0c;换句话说删除以后不会保留任何数据。 所以对于mysql这种有状态的应用&#xff0c;必须使用持久化存储作为支撑&#xff0c;才能部署成有状态的stateful. 最简单的方法就是使用nfs作为网络存储&#xff0c;因为nfs存储很容易被…...

JavaScript WebApi(二) 详解

监听事件 介绍 事件监听是一种用于在特定条件下执行代码的编程技术。在Web开发中&#xff0c;事件监听器可以用于捕获和响应用户与页面交互的各种操作&#xff0c;如点击、滚动、输入等。 事件监听的基本原理是&#xff0c;通过在特定元素上注册事件监听器&#xff0c;当事件…...

纯新手发布鸿蒙的第一个java应用

第一个java开发鸿蒙应用 1.下载和安装华为自己的app开发软件DevEco Studio HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 2.打开IDE新建工程&#xff08;当前用的IDEA 3.1.1 Release&#xff09; 选择第一个&#xff0c;其他的默认只能用(API9)版本&#xff0c;…...

UI自动化(selenium+python)之元素定位的三种等待方式!

前言 在UI自动化过程中&#xff0c;常遇到元素未找到&#xff0c;代码报错的情况。这种情况下&#xff0c;需要用等待wait。 在selenium中可以用到三种等待方式即sleep,implicitly_wait,WebDriverWait 一、固定等待(sleep) 导入time模块&#xff0c;设定固定的等待时间 缺…...

[C++]指针与结构体

标题 一.指针1.指针的定义和使用2.指针所占的内存空间3.空指针与野指针4.const修饰指针5.指针和数组6.指针和函数 二.结构体1.结构体的定义与使用2.结构体数组3.结构体指针4.结构体的嵌套使用5.结构体做函数参数6.结构体中const使用场景7.案例练习 一.指针 作用: 可以通过指针…...

注解原理是什么 Spring MVC常用的注解有哪些?

文章目录 注解原理是什么Spring MVC常用的注解有哪些&#xff1f; 通过这篇文章来和大家一起认识springMVC常用的注解&#xff0c;那么首先需要来了解注解。 注解原理是什么 注解本质是一个继承了Annotation的特殊接口&#xff0c;其具体实现类是Java运行时生成的动态代理类。…...

【数据结构】树与二叉树(廿五):树搜索指定数据域的结点(算法FindTarget)

文章目录 5.3.1 树的存储结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法1. 获取大儿子、大兄弟结点2. 搜索给定结点的父亲3. 搜索指定数据域的结点a. 算法FindTargetb. 算法解析c. 代码实现a. 使用指向指针的指针b. 直接返回找到的节点 4. 代码整合 5.3.1 树的存储结构 5.…...

深度学习图像风格迁移 - opencv python 计算机竞赛

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…...

提高SQL语句执行效率的8个方法

提高SQL语句执行效率的8个方法 在日常的数据库操作中&#xff0c;如何提高SQL语句的执行效率是每个程序员都需要关注的问题&#xff0c;SQL语句的执行效率对系统的性能有着重要影响&#xff0c;本文将介绍8种提高SQL语句执行效率的方法。 合理使用索引 索引介绍 索引是数据…...

C语言,通过数组实现循环队列

实现循环队列最难的地方就在于如何判空和判满&#xff0c;只要解决了这两点循环队列的设计就没有问题。接下来我们将会使用数组来实现循环队列。 接下来&#xff0c;为了模拟实现一个容量为4的循环队列&#xff0c;我们创建一个容量为4 1 的数组。 接下来我们将会对这个数组…...

python+pygame+opencv+gpt实现虚拟数字人直播(一)

AI技术突飞猛进&#xff0c;不断的改变着人们的工作和生活。数字人直播作为新兴形式&#xff0c;必将成为未来趋势&#xff0c;具有巨大的、广阔的、惊人的市场前景。它将不断融合创新技术和跨界合作&#xff0c;提供更具个性化和多样化的互动体验&#xff0c;成为未来的一种趋…...

c语言:模拟实现各种字符串函数(2)

strncpy函数&#xff1a; 功能&#xff1a;拷贝指定长度的字符串a到字符串b中 代码模拟实现&#xff1a; //strncpy char* my_strncpy(char* dest, char* str,size_t num) {char* ret dest;assert(dest && str);//断言&#xff0c;如果其中有一个为空指针&#xff…...

【Proteus仿真】【STM32单片机】感应水龙头设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD1602液晶模块、HCSR04超声波等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示超声波模块检测的距离&#xff0c;若检测距离小…...

P15 C++ 枚举

The ChenPi 前言 今天我们要讲的是 C 中的枚举。 enum 是 enumeration 的缩写&#xff0c;基本上可以说&#xff0c;它就是一个数值集合。如果你想要给枚举一个更实际的定义&#xff0c;它们是给一个值命名的一种方法。 所以我们不用一堆叫做 A、B、C 的整数。我们可以有一个…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...