浅谈 Android Q 系统带来的新特性和新功能

北京时间2019年3月14日Google官方正式公开发布Android Q Beta 1及其预览版SDK,这也表示了安卓开发人员又要迎来一年一度的新版本适配工作了。本次Android Q 给大家带来了挺多的新功能,如分享改进、黑夜模式、手势导航、更严格的权限管理等等。之后在4月份Beta2版本发布 。
一直到这个月 ,在 Google I/O 大会上 Google 正式发布最新的Android 10.0。本文将介绍Android Q 带来的新功能。

1.分享改进

Activity 生命周期
共享快捷方式API

Android Q中的ShareSheet已更改。直接共享API已替换为新的共享快捷方式API。现有的直接共享机制将继续有效,但优先级低于使用新API的任何应用程序。

共享快捷方式API允许应用程序提前发布直接共享目标,而不是按需检测结果。这就是如何ShortcutManager工作的。由于这两个API类似,谷歌扩展了ShortcutInfo API以使这两个功能更容易使用。使用新API,您可以直接将类别或人员分配给共享目标。共享目标在系统中保留,直到相同的应用程序更新它们或卸载应用程序。

与旧的DirectShare API中使用的拉模型相比,新API使用推送模型。这使得在准备ShareSheet时更快地检索直接共享目标的过程。从应用程序开发人员的角度来看,在使用新API时,应用程序需要提前提供直接共享目标列表,并且每次应用程序的内部状态发生更改时都可能更新快捷方式列表(例如,如果在消息传递应用程序中添加新联系人)。

2.暗夜主题

Android Q提供了一个新的Dark主题,适用于Android系统UI和设备上运行的应用程序。
暗夜主题
黑暗主题有很多好处

  • 可以大幅减少用电量(取决于设备的屏幕技术)。
  • 提高低视力用户和对强光敏感的用户的可视性。
  • 使任何人都可以在光线不足的环境中使用设备。

在Android Q中,有三种方法可以启用Dark主题:

  • 新的系统设置(设置 - >显示 - >主题)允许用户启用黑暗主题。
  • 新的“快速设置”磁贴允许用户从通知托盘中快速切换主题(一旦启用)。
  • 在Pixel设备上,Battery Saver模式还可以同时启用Dark主题。其他OEM
    可能支持也可能不支持此行为。

在您的应用中支持 Dark 主题

为了支持 Dark 主题,您必须将应用程序的主题(通常位于res/values/styles.xml)中设置为从DayNight主题继承:

<style name="AppTheme" parent="Theme.AppCompat.DayNight">

您还可以使用 MaterialComponents 的暗主题:

<style name="AppTheme" parent="Theme.MaterialComponents.DayNight">

这将应用程序的主题与系统控制的夜间模式标记联系起来,并为应用程序提供默认的 Dark 主题(启用时)。

主题和风格

您的主题和样式应避免使用硬编码颜色或只在浅色主题下使用的图标。您应该使用主题属性(首选)夜间限定资源

以下是要了解的两个最重要的主题属性:

  • ?android:attr/textColorPrimary这是一种通用文本颜色。它在Light主题中接近黑色,在Dark主题上接近白色。它包含一个禁用状态。
  • ?attr/colorControlNormal通用图标颜色。它包含一个禁用状态。

建议使用Material Design Components,因为它的颜色主题系统 (例如主题属性**?attr/colorSurface和?attr/colorOnSurface**)可以轻松访问合适的颜色。当然,您可以在主题中自定义这些属性。

强制黑暗

Android Q提供 Force Dark,这是开发人员在没有明确设置主题的情况下快速实现Dark主题的功能,DayNight 如上所述。

Force Dark 分析以光为主题的应用程序的每个视图,并在绘制到屏幕之前自动应用黑暗主题。一些开发人员使用 Force Dark 和本机实现的混合来减少实现Dark主题所需的时间。

应用必须通过设置 android:forceDarkAllowed=“true” 应用主题来选择加入强黑。此属性设置在所有系统和AndroidX提供的轻量级主题上,例如Theme.Material.Light。当您使用Force Dark时,您应该确保彻底测试您的应用并根据需要排除视图。

如果您的应用使用黑暗主题(例如 Theme.Material ),则不会应用强制黑暗。同样,如果您的应用主题继承自 DayNight 主题,则由于自动主题切换,将不会应用强制黑暗。

禁用视图上的强制黑暗
可以使用android:forceDarkAllowed 布局属性或使用特定视图控制强制暗setForceDarkAllowed()。

3.手势导航

手势操作
Android Q引入了完全手势系统导航的选项。应用开发者应该为准备此功能做两件事:

  • 将应用内容从边缘扩展到边缘。
  • 处理冲突的app手势。

设置透明系统栏

您可以通过在主题中设置以下值来执行此操作:

<!-- values-29/themes.xml: -->

<style name="AppTheme" parent="...">
    <item name="android:navigationBarColor">@android:color/transparent</item>
    <!-- Optional, but recommended for full edge-to-edge rendering -->
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

或者,您可以使用Window.setNavigationBarColor() 和动态执行此操作 Window.setStatusBarColor()。

处理冲突的应用手势

手势导航模型可能与应用程序开发人员以前使用的手势冲突。因此,您可能需要调整应用的用户界面。

与返回手势冲突

Back的新系统手势是从屏幕的左边缘或右边缘向内滑动。这可能会干扰这些区域中的应用导航元素。要保持屏幕左右边缘元素的功能,您需要选择退出Back手势,方法是向系统指示哪些区域需要接收触摸输入。你可以通过传递一个做到这一点List View.setSystemGestureExclusionRects() 在Android Q的介绍这种方法API也可用于 ViewCompat作为 androidx.core:core:1.1.0-dev01

List < Rect > exclusionRects ;

public void onLayout ( 
        boolean changedCanvas ,int left ,int top ,int right ,int bottom ){ 
    //更新rect bounds和exclusionRects列表
    setSystemGestureExclusionRects (exclusionRects );
}

public void onDraw (Canvas canvas ){ 
    //更新rect bounds和exclusionRects列表
    setSystemGestureExclusionRects (exclusionRects );
}

与Home / Quick Switch手势冲突

Home和快速切换的新系统手势都涉及在导航栏先前占据的空间中屏幕底部的滑动。应用无法选择退出这些手势,因为他们可以使用Back手势。

为了缓解这个问题,Android Q引入了 WindowInsets.getMandatorySystemGestureInsets() API,通知应用程序触摸识别阈值。

4.更加严格的隐私权限管理

Android Q中对用户的隐私安全有了进一步的更加严格的管控机制,更有效的保证了用户的隐私

限制访问屏幕内容

为了保护用户的屏幕内容,Android Q通过改变READ_FRAME_BUFFERCAPTURE_VIDEO_OUTPUTCAPTURE_SECURE_VIDEO_OUTPUT权限的范围,使他们只能通过 签名访问 。
需要访问设备屏幕内容的应用应使用 MediaProjection API,而该API会显示提示,要求用户提供同意。

Location位置权限

Android Q可让用户更好控制应用何时能够访问设备位置信息。当在Android Q上运行的应用请求位置访问权限时,会弹出下面的对话框。此对话框可让用户将位置信息访问权限授予到两个不同的范围:在使用中(仅限前台)或始终(前台和后台)。

位置权限

Android Q引入新的位置权限:ACCESS_BACKGROUND_LOCATION。这个权限与现有 ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION 权限不同的是,新权限仅会影响应用在后台运行时对位置信息的访问权。除非应用的某个 Activity 可见或应用正在运行前台服务,否则应用将被视为在后台运行。可用如下代码来检测位置权限:

boolean permissionAccessCoarseLocationApproved =
        ActivityCompat.checkSelfPermission(this, permission.ACCESS_COARSE_LOCATION)
            == PackageManager.PERMISSION_GRANTED;
 
if (permissionAccessCoarseLocationApproved) {
   boolean backgroundLocationPermissionApproved =
           ActivityCompat.checkSelfPermission(this,
               permission.ACCESS_BACKGROUND_LOCATION)
               == PackageManager.PERMISSION_GRANTED;

   if (backgroundLocationPermissionApproved) {
       // 可在前台和后台访问位置信息
   } else {
       // 只能在前台访问位置信息
       ActivityCompat.requestPermissions(this, new String[] {
           Manifest.permission.ACCESS_BACKGROUND_LOCATION},
           your-permission-request-code);
   }
} else {
   // 没有访问位置信息的权限,需要申请
   ActivityCompat.requestPermissions(this, new String[] {
        Manifest.permission.ACCESS_COARSE_LOCATION,
        Manifest.permission.ACCESS_BACKGROUND_LOCATION
        },
        your-permission-request-code);
}

由此可见如果用户出于某种原因拒绝应用的后台访问,则将在位置检索中进行回退。

Android Q 改变了应用程序使用位置权限的方式。无论是在前台还是后台,apps 都将无法从服务中自由访问用户位置。为了支持向后兼容性,如果应用程序不以 Q 为目标,那么如果声明了 COARSEFINE 权限,那么 ACCESS_BACKGROUND_LOCATION 权限也将被添加添加上。类似地,在运行时请求这两者中的任何一个也将授予这个权限。

这些更改使用户能够更好地控制应用程序访问其位置的方式,从而使开发者能够创建考虑到用户隐私安全的 apps。

作者:黄磊
原文地址:https://blog.csdn.net/weixin_43243006/article/details/90731511

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值