文章微信公众号「AndroidTraveler」首发

5 月 20 号参加了 Android Q Labs,因此本篇说一说会议的部分内容以及自己的一些想法。

会议主要是加深开发者对 Android Q 的了解,从而帮助开发者做好 Android Q 的兼容工作。

因此本篇我会选择性说明一些在 Android Q 上你需要兼容的一些事情。

1. 后台 Activity 启动限制

首先我们说说为什么要限制后台 Activity 的启动。

Android Q 之前的情况如下:

考虑下面的几个场景:

  1. 我在开车过程中使用导航地图进行导航
  2. 我在使用拍照功能拍摄一个关键场景的视频
  3. 我在玩游戏,比如王者荣耀,正准备团战拿五杀的时刻
    ......

假设在上面的几个场景中,突然后台 Activity 弹出一个框,可能是广告框,也可能是抢占我界面的其他界面。

这个时候我觉得内心是奔溃的,而且用户体验超级不好。

基于此,Android Q 里面引入了对后台 Activity 启动的限制。

注意关键的一个点是这个变化对所有在 Android Q 上运行的应用都会有影响。无论你的 targetSDK 版本。

所以如果你的 APP 存在这种场景的情况下,你就需要做一下额外处理了。

基本的处理方式是通过 Notification 弹一个通知,如果用户想点再点击进入你的 Activity。

那么现在有哪些 APP 会用到这种呢?举一个大家熟悉的。

这边测试了一下,微信语音通话是会直接从后台启动全屏覆盖的,所以可能微信需要针对这个行为变更做处理。

2. 存储的变化

先看下 Q 之前的情况:

Q 的变化分两部分来说明吧。

一部分是 MediaStore 的处理,另一部分是分区存储的处理。

先说说 MediaStore,什么是 MediaStore 呢?

对于 MediaStore,Q 的处理如下:

可以看到对于 MediaStore,可以直接写,读的话仅仅限于自己写进去的文件。如果要查看其它应用提供的内容,需要获取读权限。

另外你会发现 MediaStore 上面只有媒体相关的,如果文件是非媒体类型呢?所以 Q 新增 MediaStore.Downloads,如下:

总结起来如下:

权限的变更:在没卸载的情况下,自己 APP 写或者读 MediaStore 媒体文件不需要权限。读其他的需要权限。卸载后读自己之前写入的也需要权限。

另外还有一个就是图片有一个位置信息,这个对用户来说也是隐私,因此需要做额外处理。

说完了 MediaStore,接下来说说分区存储。

总结起来就是分区存储模式下,不能够再直接访问 /sdcard 下的文件,而要通过 MediaStore 或者 SAF。当然自己 packagename 命名的目录下面还是可以访问的。

另外目前可以通过在清单文件设置是否启用。可以设置 targetSDK 为 Q 的应用不启用,也可以设置 targetSDK 低于 Q 的启用。通过代码可以确认是否处于分区存储模式下。

推荐尽快完成适配,因为目前是为了给开发者更多时间适应这个变化,等到下一个版本 Android R 的时候会强制执行分区存储模式,到时候清单文件的设置也是没用的。因此强烈建议将这个工作排上兼容行程。当然在 Q 的兼容上可以根据自身业务进度进行设置,假设时间不够,可以暂时不启用,但是后续需要排期处理。

3. 位置权限

我们看看 Android P 申请位置权限的对话框:

可以看到只有允许和拒绝两个选项。

现在看看 Android Q 的:

会发现多了一些选项,其中有一个仅在使用该应用时允许

在 Android P 的时候,清单文件只需要申请一个权限:

而在 Q 上面,有两个,其中一个有 background 的。

之所以有两个,就是希望尽量少的获取权限,除非是你的 APP 真的有这个需求。在申请的时候也建议增量申请,什么意思呢?

首先第一步先获取位置权限:

在用户允许的情况下,如果 APP 需要,再进行增量权限请求:

推荐的位置权限最佳实践如下:

4. 深色主题

Q 支持深色主题,兼容有两种方式。

一种就是简单粗暴,适合时间少的。
一种就是推荐的,适合有足够时间的。

简单的方式如果是全局设置,只需要设置主题即可:

如果你需要对单个 View 做设置,也是可以的:

推荐的方式是使用 DayNight。

不过我在测试区启动深色主题时发现有点卡,估计后面系统还需要优化。

5. BubbleView 和指纹识别

BubbleView 其实就是悬浮窗。指纹识别也是 Android Q 引入的一个官方方式。
这个不需要做兼容,算是新功能,这里不赘述。

6. Kotlin vs Flutter

其实在代码演示的时候,我注意到 PPT 上面的代码基本都是 Kotlin。

包括之前的 Kotlin-first 以及这次 Q & A 环节也有小伙伴提问到底 Google 主推 Kotlin 还是 Flutter。

我这边说下我的看法吧。

我觉得 Kotlin 和 Flutter 不冲突。

首先第一个 Kotlin 是一门语言,而 Flutter 是一个跨平台方案。

如果你的 APP 有跨平台的需求,或者有很多页面需要开发,人手不足,功能迭代比较频繁,那么你可以了解或者尝试使用 Flutter 来开发界面。一套代码,两端运行。尤其 Flutter 1.5 布局很广,涵盖了移动端、Web、桌面端和嵌入式。

对于 Android 开发者,可以看我的 Flutter 即学即用系列博客快速入门

说完了 Flutter,说下 Kotlin 吧。

Kotlin 是一门语言,语言是干嘛的?是实现我们业务的工具。

假设现在 Java 和 Kotlin 都可以实现我们的业务功能,并且官方都支持这两种语言,你有必要花很多时间去单独学习 Kotlin 吗?我觉得没太大必要。

所以我觉得对待 Kotlin 你可以了解一下,能够看懂 Kotlin 代码,会写简单的 Demo,我觉得就够了。

当然如果你时间足够,想多学一门语言,完全没问题。

以上是参加这次会议的一些简单总结和看法,更多内容通过下面的全程录像了解。

本次 Android Q Labs 全程录像可以通过链接观看:Android Q Labs

Android Q 兼容那些事的更多相关文章

  1. 谷歌的Android Q到底有哪些新特性及变更?

    Android Q 隐私更改相关介绍 存储范围变更 Android Q 改变了应用程序访问设备外部存储上文件的方式. 通过使用更细粒度的媒体特定权限替换以前的 READ_EXTERNAL_STORAG ...

  2. Android Q Beta 6 终极测试版发布!

    前言 当今手机市场可谓是百花齐放,但手机系统却屈指可数,其中Android和iOS就占据了整个手机系统市场的99%,单单Android就占据了整个手机系统市场的86%,可谓是占据绝对优势.     其 ...

  3. Android 谈谈封装那些事 --BaseActivity 和 BaseFragment(二)

      1.前言 昨天谈了BaseActivity的封装,Android谈谈封装那些事--BaseActivity和BaseFragment(一)有很多小伙伴提了很多建议,比如: 通用标题栏可以自定义Vi ...

  4. Android打包的那些事

    使用gradle打包apk已经成为当前主流趋势,我也在这个过程中经历了各种需求,并不断结合gradle新的支持,一一改进.在此,把这些相关的东西记录,做一总结. 1. 替换AndroidManifes ...

  5. android v7兼容包RecyclerView的使用(四)——点击事件的不同方式处理

    前三篇文章 android v7兼容包RecyclerView的使用(三)--布局管理器的使用 android v7兼容包RecyclerView的使用(二) android v7兼容包Recycle ...

  6. 不可不知的 Android strings.xml 那些事

    相信 strings.xml 已经是大家在 Android 开发中最熟悉的文件之一了,但其实它也有很多需要注意的地方和一些小技巧,知道了这些可以让你的 Android 应用更加规范易用,大家来看看吧. ...

  7. 【Android Studio安装部署系列】三十七、从Android Studio3.2升级到Android Studio3.4【以及创建Android Q模拟器】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 保持Android Studio开发环境的最新版本. 下载Android Studio3.4 使用Android Studio自带的 ...

  8. Android Q 变更和新特性

    安全和隐私变更 隐私保护是Android Q重要的主题之一,Android Q带来了一系列增强用户隐私保护的变更. 1 应用文件存储空间限制 应用访问限制是Android Q影响最大变更之一.在And ...

  9. android Q build 变化

    一 概述 android Q build变化整体上越来越严格,语法上之前能够使用的Q上将不能使用. 二 主要变化 2.1  'USER' 弃用 ‘USER’后面的值会被设置成‘nobody',andr ...

随机推荐

  1. Vue 父子组件间的通信

    前言 在 Vue 项目中父子组件的通信是非常常见的,最近做项目的时候发现对这方面的知识还不怎么熟练,在这边做一下笔记,系统学习一下吧. 1 父组件传值给子组件 1.1 传值写法 父组件传值给子组件,这 ...

  2. 并查集:CDOJ1593-老司机破阵 (假的并查集拆除)

    老司机破阵 Time Limit: 4500/1500MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Problem Descri ...

  3. Prolog&Epilog

    这篇博客会简单介绍一下Prolog&Epilog 然后再简单介绍下我对于程序在计算机中到底如何运行的一些理解(因为自己之前也从来没有接触过这些方面的知识,所以如果有讲的不对的地方希望大家能够帮 ...

  4. BZOJ 4425: [Nwerc2015]Assigning Workstations分配工作站

    难度在于读题 #include<cstdio> #include<algorithm> #include<queue> using namespace std; p ...

  5. CodeForces 568B DP Symmetric and Transitive

    题意: 根据离散数学的内容知道,一个二元关系是一个二元有序组<x, y>的集合. 然后有一些特殊的二元关系,比如等价关系,满足三个条件: 自反性,任意的x,都有二元关系<x, x&g ...

  6. Leetcode 467.环绕字符串中的唯一子字符串

    环绕字符串中的唯一子字符串 把字符串 s 看作是"abcdefghijklmnopqrstuvwxyz"的无限环绕字符串,所以 s 看起来是这样的:"...zabcdef ...

  7. TensorFlow学习笔记(6):TensorBoard之Embeddings

    本文基于TensorFlow官网的How-Tos写成. TensorBoard是TensorFlow自带的一个可视化工具,Embeddings是其中的一个功能,用于在二维或三维空间对高维数据进行探索. ...

  8. Codeforces Round #410 (Div. 2) B. Mike and strings

    B. Mike and strings time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. Spring 4.3.11.RELEASE文档阅读(一):overview

    一.宏观概述中的体会和发现 Spring是组件式的框架,它允许我们只使用其一小部分.Spring所做的工作,就是不断的简化我们的操作.比如它的IOC容器,当我们自己应用设计模式,比如说:建造者.工厂. ...

  10. kb-07线段树-03--区间修改查询--lazy思想

    /* 区间修改,区间查询和: 第一次使用lazy思想: poj3468 */ #include<iostream> #include<cstdio> #include<c ...