当前位置:   article > 正文

Android 14 的 8 个重要新特性深度解析_android14新特性

android14新特性

Android 14 的 8 个重要新特性深度解析

每年一次的Android升级从不缺席。今年的版本名为倒置蛋糕(Upside Down Cake),简称U,对外的版本号是Android 14。

通常来说,升级任务可以从两个角度来考虑:ROM角度和应用程序(App)角度。前者主要关注系统内部的变化,而后者则更关心新功能和行为变化。这篇文章主要关注应用程序角度,即如何处理第三方应用在Android 14升级中的问题。考虑到升级内容非常庞杂,我们首先介绍新功能部分。这样做的原因是新功能往往容易被人们忽视,但它们实际上非常重要。

之所以这样说,是因为与行为变化不同,如果在系统升级后遇到问题,只需查阅文档就可以知道Android 14进行了哪些更改以及如何进行调整。而新功能则是指添加的新功能和接口,不会影响应用程序的原有逻辑,但却能够解决问题、优化体验,并提供独特的能力。从长远来看,这些新功能更具价值。

如果开发者总是忽视了新功能部分,那么应用程序很可能会停留在旧的实现上、旧的方案上,操作系统升级的工作也就变成了被动的升级。因此,建议大家不仅关注行为变化,还要多留意新功能是否可以改善现有方案,从而优化产品体验。

Android 14引入了许多新的API,我已经试用了其中大部分,并且还开源了一些演示示例。本文将以易于理解的语言从设计原理和使用解读的角度带大家深入了解这8个重要的新特性。

  • 1.截屏感知(ScreenShot Detection)
  • 2.文本高亮(TextView Highlight)
  • 3.全新的系统返回设计(New System Back Design)
  • 4.支持自定义操作的系统分享(Custom Action on Share Sheet)
  • 5.区域偏好(Locale Preferences)
  • 6.语法性别(Grammar Gender)
  • 7.路径迭代器(Path Iterator)
  • 8.安装改善(Package Installer improvement)

1.截屏感知(ScreenShot Detection)

有些应用需要监听用户的截屏操作,以提供反馈或通知。开发者如何实现此功能?

通常,开发者会通过监听存放截屏文件的媒体目录的变化来间接实现。不过,这种方法通常需要运行时级别的读写权限,处理不慎可能会涉及隐私问题。

为解决这个问题,Android 14推出了专用API:ScreenShotCallback。使用该API,开发者无需运行时级别的读写权限,只需在应用安装时声明相应权限即可获授权。

<uses-permission android:name="android.permission.DETECT_SCREEN_CAPTURE" />
  • 1

Activity中代码处理如下:

class ScreenShotActivity : AppCompatActivity() {
     private val screenCaptureCallback = ScreenCaptureCallback {
         // 提醒用户等操作
         AlertDialog.Builder(this).show()
     }

     override fun onStart() {
         super.onStart()
         registerScreenCaptureCallback(mainExecutor, screenCaptureCallback)
     }

     override fun onStop() {
         super.onStop()
         unregisterScreenCaptureCallback(screenCaptureCallback)
     }         
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

使用改API完成截屏监听效果如下所示:

2.文本高亮(TextView Highlight)

Mail、SMS、Note 类的 App 经常需要将文本中的某些部分设置为高亮显示,传统的方法通常是使用 Spannable。但是,这种方法的代码有点复杂,并且更新高亮不太方便。

HighLight APIs

为了解决这个问题,Android 14 提供了一种专门的 API,叫做 HighLights,它提供了更简单、更灵活的实现方式。

首先,它支持静态设置高亮:

  • 使用 Highlights.Builder 构建 HighLights 对象
  • 通过 addRange() 方法设置要高亮的范围和样式
  • 通过 TextView 的新方法setHighLights()应用高亮效果

其次,它还支持动态设置高亮:

  • 使用 getHighLights() 方法获取已存在的 HighLights 实例
  • 修改其样式和范围
  • 调用 invalidate() 方法动态更新高亮效果

下面的代码演示了如何将文本中的黄色和绿色部分静态高亮显示,并在点击按钮后将绿色高亮改为深蓝色高亮:

class MainActivity : AppCompatActivity() {
     ...
     override fun onCreate(savedInstanceState: Bundle?) {
         ...
         val greenPaint = Paint().apply {
             color = Color.GREEN
         }

         with(binding.textview1) {
             text = TEXT
             val builder = Highlights.Builder()
                 .addRange(yellowPaint, 0, 3)
                 .addRange(greenPaint, 14, 24)
                 .addRange(greenPaint, 25, 32)
             highlights = builder.build()
         }

         binding.changeHighlights.setOnClickListener {
             Log.d("HighLights", "changeHighlights tapped & change highlights")
             textView1Highlights?.apply {
                 // Change color
                 getPaint(1).color = Color.BLUE
                 // Change ranges
                 getRanges(1)[0] -= 3
                 getRanges(1)[1] += 1

                 for (i in 0 until size) {
                     Log.d("HighLights", "textView1Highlights'" +
                             " paint:${getPaint(i).color.toColorString()}")
                     val range = getRanges(i)
                     for (j in range.indices) {
                         Log.d("HighLights", "ranges:${range[j]}")
                     }
                 }
             }

             binding.textview1.invalidate()
         }
     }
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

代码演示效果如下图所示:

HighLights API是否适应多语言?答案是NO,HighLights API与多语言无关,需自行处理不同语言下的目标高亮范围。

搜索Highlight

除了一般的高亮,Android 14 还引入了专门用于搜索的高亮 API。这些 API 主要与TextView相关,并包括以下新方法:

  • searchResultHighlightColor:设置搜索匹配到的文字高亮颜色。
  • focusedSearchResultHighlightColor:设置搜索焦点所在位置的高亮颜色。
  • setSearchResultHighlights:设置搜索到的文字范围进行高亮显示。
  • range focusedSearchResultIndex:用于搜索焦点的高亮和移动,有三个常量:
    -1:搜索尚未开始或未找到结果。
    0:找到了搜索结果。
    1:聚焦在某个搜索结果上。

下面的代码示例将匹配到的搜索关键字高亮显示为水蓝色,聚焦到匹配结果的高亮显示为灰色。通过模拟 search button(搜索按钮)和 forward button(前进按钮)来模拟匹配到的文字范围和搜索焦点的移动。

class TextViewActivity : AppCompatActivity() {
     override fun onCreate(savedInstanceState: Bundle?) {
         ...
         with(binding.textview2) {
             searchResultHighlightColor = Color.CYAN
             focusedSearchResultHighlightColor = Color.GRAY
         }

         // 模拟搜索按钮
         binding.startSearch.setOnClickListener {
             binding.textview2.run {
                 Log.d("HighLights", "startSearch tapped" +
                         " and current search Color:${searchResultHighlightColor.toColorString()}"
                 )
                 // set searching ranges
                 setSearchResultHighlights(4, 11, 25, 32)
             }
         }

         binding.changeSearchIndex.setOnClickListener {
             binding.textview2.run {
                 // Set index to first or second
                 val newSearchIndex = when (focusedSearchResultIndex) {
                     TextView.FOCUSED_SEARCH_RESULT_INDEX_NONE, 1 -> 0
                     0 -> 1
                     else -> TextView.FOCUSED_SEARCH_RESULT_INDEX_NONE
                 }

                 binding.textview2.focusedSearchResultIndex = newSearchIndex
             }
         }
     }
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

代码演示效果如下所示:

3.全新的系统返回设计(New System Back Design)

随着屏幕越来越大,我们的手机变得更加多样和灵活,传统的返回按键和虚拟键开始显得不太必要了。那么,如何简化返回操作并统一开发方式就变得非常重要。

(全新返回箭头)New Back Arrow

从 Android 13 开始,对于返回事件的处理进行了统一。如果想要使用这个新特性,首先需要进行两个设置:

  1. 在清单文件(Manifest)中打开 enableOnBackInvokedCallback
  2. 在 Activity 中注册实现返回逻辑的 OnBackInvokedCallback

在 Android 14 中,对系统的返回效果进行了进一步升级,其中一项是对箭头进行的优化,具体包括:

  1. 添加了箭头的边框和背景,更加明显可见。
  2. 根据系统的 Material Design 主题自动适配,当主题改变时,箭头的背景颜色也会相应更新。

通过下面的对比,你可以看到 Android 14 的系统返回箭头相较于 Android 13,更加协调和清晰。

即将返回的预览功能(Predictive Back Preview)

第二个方面是添加返回预览功能,让用户能够提前查看即将返回的界面,以便决定是取消还是继续进行返回操作。这个功能目前还在不断完善中,如果你想要体验,需要在开发者选项中手动开启。

步骤如下:进入【设置】>【系统】>【开发者选项】>【预测性返回手势动画(Predictive back animation)】。

在下面的效果图中,你可以看到当触发返回手势时,整个应用界面会被缩小,并展示一个背面画面的预览效果。

4.支持自定义操作的系统分享(Custom Action on Share Sheet)

“”"
现如今,App生态日益丰富,数据分享变得尤为重要。通常情况下,分享界面的呈现取决于App的适配和系统的调度。然而,涉及更多细节和具体操作时,系统或App可能无法及时涵盖,因此自定义分享操作的支持变得十分必要。

Android 14中引入了ChooserAction类,可在创建标准分享界面时,使用该类展示自定义操作和信息,以提供更丰富的分享菜单:

  1. 使用ChooserAction.Builder创建自定义ChooserAction对象
    a. 指定Icon
    b. 指定Title
    c. 指定分享菜单点击后目标的PendingIntent类型的操作
  2. 使用Intent#createChooser()创建标准的Chooser Intent
  3. ChooserAction实例放入键名为EXTRA_CHOOSER_CUSTOM_ACTIONS的Bundle中

值得注意的是,传入的参数是ChooserAction数组,因为可以同时支持多个自定义操作

以下代码展示了设置自定义分享的标准写法:

class ShareSheetActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        val pendingIntent: PendingIntent =PendingIntent.getActivity(
            this@ShareSheetActivity,
            0,
            Intent(Intent.ACTION_WEB_SEARCH).apply {
                putExtra(SearchManager.QUERY, "Search on web 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/726182
推荐阅读
相关标签