hi 大家好,我是 DHL。上任于美团、快手、小米。大众号:ByteCode,专注有用、风趣的硬核原创内容,Kotlin、功能优化、体系源码、图解算法、大厂面经。

Android 14 要来了,做好准备要开端适配 Android 14 了,这篇文章首要介绍在 Android 14 上一些功用和权限的改变,接下来咱们一起来看一下这些行为的改变对咱们的 App 产生哪些影响。

有必要提供前台服务类型

从 Android 14 开端,假如运用了前台服务需求指定至少一个前台服务类型。假如没有指定,那么在调用 startForeground() 办法的时候,将会抛出 MissingForegroundServiceTypeException 反常。

为了帮助开发人员更好的运用前台服务,Android 10 在 <service> 元素中增加了 android:foregroundServiceType 屬性,在这个特点中指明前台服务类型,咱们也能够将多种前台服务类型合并运用,代码如下所示。

<manifest ...>
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
  <uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
    <application ...>
      <service
          android:name=".MyMediaPlaybackService"
          android:foregroundServiceType="mediaPlayback"
          android:exported="false">
      </service>
    </application>
</manifest>

Android 提供了以下前台服务类型:

  • camera
  • connectedDevice
  • dataSync
  • health
  • location
  • mediaPlayback
  • mediaProjection
  • microphone
  • phoneCall
  • remoteMessaging
  • shortService
  • specialUse
  • systemExempted

Android 14 新增了一些前台服务类型:

  • health
  • remoteMessaging
  • shortService
  • specialUse
  • systemExempted

运行时动态注册播送接收器有必要指定导出行为

在 Android 14 上,运行时经过 Context#registerReceiver() 动态注册播送接收器,需求设置符号 RECEIVER_EXPORTEDRECEIVER_NOT_EXPORTED ,标识是否导出该播送,防止使用程序出现安全漏洞,假如注册的是体系播送,则不需求指定符号。

隐式意图约束

Android 14 约束 App 运用隐式意图,假如经过一个隐式意图发动一个 exported = false 的组件,将会抛出反常。

例如我在 manifest 中声明了一个 exported = false 的组件 activity,一起也声明了一个隐式意图。

<activity
    android:name=".AppActivity"
    android:exported="false">
    <intent-filter>
        <action android:name="com.example.action.APP_ACTION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

假如咱们运用下面的办法,经过隐式意图翻开 activity 将会抛出反常。

// Throws an exception when targeting Android 14.
context.startActivity(Intent("com.example.action.APP_ACTION"))

假如要发动 exported = false 的组件,应该运用显示意图。

// This makes the intent explicit.
val explicitIntent = Intent("com.example.action.APP_ACTION")
explicitIntent.apply {
    package = context.packageName
}
context.startActivity(explicitIntent)

更安全动态加载程序代码

在 Android 14 上,假如你的 App 运用了动态加载程序代码,需求指定为只读状况,否则体系将会抛出反常。示例代码如下所示。

val jar = File("DYNAMICALLY_LOADED_FILE.jar")
val os = FileOutputStream(jar)
os.use {
    // Set the file to read-only first to prevent race conditions
    jar.setReadOnly()
    // Then write the actual file content
}
val cl = PathClassLoader(jar, parentClassLoader)

SCHEDULE_EXACT_ALARM 权限

在 Android 12 上新增 SCHEDULE_EXACT_ALARM 权限,可设置准确闹钟时刻,能够调用 setAlarmClock()setExact()
setExactAndAllowWhileIdle() 等等办法设置准确闹钟时刻, 可是需求在 manifest 中申明 android.permission.SCHEDULE_EXACT_ALARM 权限。
https://developer. android. com/about/versions/12/behavior-changes-12 #exact -alarm-permission

从 Android 14 开端 SCHEDULE_EXACT_ALARM 权限,不在授予 Android 13 以上的版别为方针的使用程序,该权限默认为回绝状况。

只能停止自己的使用程序

从 Anroid 14 开端,当咱们调用 ActivityManager#killBackgroundProcesses() 办法时,只能停止自己的使用程序,假如传入其他使用程序的包名,不会对其他使用程序产生影响,Logcat 也会输出相应的提示。

Invalid packageName: com.example.anotherapp

可装置方针 App targetSdkVersion 下限

从 Android 14 开端,无法装置 targetSdkVersion < 23 的 App,这一意图首要为了进步运用者的安全性和隐私权。

比如某些歹意 App 设置 targetSdkVersion == 22,防止遭到 Android 6.0 Marshmallow 权限的影响,Android 14 改变会让歹意 App 更难躲过更严谨的安全性和隐私权办法,假如你尝试装置 targetSdkVersion < 23 的 App,将会装置失利。

INSTALL_FAILED_DEPRECATED_SDK_VERSION: App package must target at least SDK version 23, but found 7

运用者无法封闭告诉的改变

调用 Notification.Builder#setOngoing(true)NotificationCompat.Builder#setOngoing(true) 办法能够防止运用者封闭前台告诉,从 Android 14 开端允许运用者封闭这类型的告诉,可是但在下列情況下,运用者无法封闭告诉:

  • 手机锁守时
  • 点击全部铲除告诉的按钮(防止不小心封闭告诉)

字体缩放 200%

从 Android 14 开端,体系支撑 200% 的字体缩放倍数,为低视能运用者提供符合无障碍网页内容标准 (WCAG) 的额外无障碍选项。

假如您现已运用缩放像素 (sp) 单位来定义文字大小,则此改动或许不会对您的使用程式造成太大影响。

关于 Android 12 和 Android 13 功用和权限的改变,点击下方链接前检查:

  • Android 13这些权限抛弃,你的使用受影响了吗?
  • Android 12 已来,你的 App 崩溃了吗?

全文到这里就结束了,感谢你的阅览,坚持原创不易,欢迎在看、点赞、共享给身边的小伙伴,我会继续共享原创干货!!!


我开了一个云同步编译东西(SyncKit),首要用于本地写代码,同步到长途设备,在长途设备上进行编译,最终将编译的成果同步到本地,代码现已上传到 Github,欢迎前往库房 hi-dhl/SyncKit 检查。

  • 库房 SyncKit:https://github.com/hi-dhl/SyncKit
  • 下载地址:https://github.com/hi-dhl/SyncKit/releases

Hi 大家好,我是 DHL,上任于美团、快手、小米。大众号:ByteCode ,共享有用、风趣的硬核原创内容,Kotlin、Jetpack、功能优化、体系源码、算法及数据结构、动画、大厂面经,真挚推荐你重视我。

  • 大众号:ByteCode
  • 哔哩哔哩: space.bilibili.com/498153238
  • : juejin.im/user/259450…
  • 博客: hi-dhl.com
  • Github: github.com/hi-dhl

最新文章

  • Android 13这些权限抛弃,你的使用受影响了吗?
  • Android 12 已来,你的 App 崩溃了吗?
  • 国外大厂面试题, 7 个 Android Lifecycle 重要的知识点
  • Android 利器,我开发了云同步编译东西
  • Twitter 上风趣的代码
  • 谁动了我的内存,揭秘 OOM 崩溃下降 90% 的隐秘
  • 反射技巧让你的功能提高 N 倍
  • 90%人不懂的泛型局限性,泛型擦除,星投影
  • 揭秘反射真的很耗时吗,射 10 万次耗时多久
  • Google 宣布抛弃 LiveData.observe 办法
  • 影响功能的 Kotlin 代码(一)
  • 揭秘 Kotlin 中的 == 和 ===

开源新项目

  • 云同步编译东西(SyncKit),本地写代码,长途编译,欢迎前去检查 SyncKit

  • KtKit 小巧而有用,用 Kotlin 言语编写的东西库,欢迎前去检查 KtKit

  • 最全、最新的 AndroidX Jetpack 相关组件的实战项目以及相关组件原理剖析文章,正在逐步增加 Jetpack 新成员,库房继续更新,欢迎前去检查 AndroidX-Jetpack-Practice

  • LeetCode / 剑指 offer,包括多种解题思路、时刻复杂度、空间复杂度剖析,在线阅览