Android 16:开发者需要关注的重要变化

15 阅读5分钟

Android 16:开发者需要关注的重要变化

1. 核心生成式 AI API

Android 15 的 AI 组件将端侧模型推到了前台。Android 16 预计会在此基础上,提供标准化、高层级的 生成式 AI API。这将使应用能够通过共享且优化的系统服务执行常见的生成任务(如文本摘要或简单图像生成),而无需打包体积庞大的模型。

示例:使用系统文本摘要器

// 假设的系统级生成式文本服务
val textGenerator = context.getSystemService(Context.TEXT_GENERATOR_SERVICE) as TextGeneratorManager

val request = TextSummarizationRequest.Builder(
    "Your long block of text here..."
).setMaxLength(100)
 .setPrompt("Summarize this for a general audience.")
 .build()
// 使用回调异步获取结果
textGenerator.generate(request, context.mainExecutor, object : TextGeneratorCallback {
    override fun onResult(response: TextSummarizationResponse) {
        val summary = response.text
        // 更新 UI 显示摘要
    }
    override fun onError(errorCode: Int, message: CharSequence) {
        // 处理生成错误
    }
})

建议:思考如何在小功能中引入生成式 AI。借助系统级 API,接入门槛将大幅降低,可以在不显著增加应用体积的情况下引入强大能力。


2. 应用作用域 Wi-Fi 访问

隐私仍然是重点。继 Scoped Storage 和 Photo Picker 之后,Android 16 可能引入 应用作用域的 Wi-Fi 访问。应用不再通过 ACCESS_WIFI_STATE 权限获取附近所有 Wi-Fi 列表,而是只能看到曾连接过或用户明确授权的网络。

对于确实需要扫描全部网络的应用(如网络分析工具),可能会引入新的权限。

示例:请求更广泛的 Wi-Fi 访问权限

// 在 AndroidManifest.xml 中
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NEARBY_WIFI_DEVICES" />

// 在 Activity 或 Fragment 中
private val requestPermissionLauncher =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
        if (isGranted) {
            // 权限已授予,可以扫描所有网络
        } else {
            // 向用户解释权限用途
        }
    }

fun startWifiScan() {
    when {
        ContextCompat.checkSelfPermission(
            this, "android.permission.ACCESS_NEARBY_WIFI_DEVICES"
        ) == PackageManager.PERMISSION_GRANTED -> {
            // 可以开始扫描
        }
        else -> {
            // 请求权限
            requestPermissionLauncher.launch("android.permission.ACCESS_NEARBY_WIFI_DEVICES")
        }
    }
}

建议:审查应用中对 Wi-Fi 状态的使用。如果不需要扫描所有网络,可能无需改动;否则需要新增运行时权限请求,并向用户说明用途。


3. 增强的锁屏小组件与实时活动

锁屏个性化趋势持续增强。Android 16 可能为开发者提供更规范的 API,用于创建锁屏上的信息卡片或“实时活动”(Live Activities)。这允许如打车、外卖或运动类应用以低功耗、持续更新的方式展示实时信息。

这可能是对现有 Glance API 的演进。

示例:配送状态锁屏组件

// 一种新的锁屏 AppWidgetProvider
class DeliveryStatusWidgetProvider : GlanceableWidgetProvider() {

    // 定义锁屏展示内容的新方法
    override fun onProvideLockScreenView(context: Context, id: Int): RemoteViews {
        return RemoteViews(context.packageName, R.layout.widget_delivery_status_lockscreen)
            .apply {
                setTextViewText(R.id.delivery_eta, "5 minutes away")
                setProgressBar(R.id.delivery_progress, 100, 80, false)
            }
    }

    // 通过前台服务更新组件
    fun updateWidget(context: Context, status: String, progress: Int) {
        val appWidgetManager = AppWidgetManager.getInstance(context)
        val remoteViews = RemoteViews(context.packageName, R.layout.widget_delivery_status_lockscreen)
        // 更新 UI
        appWidgetManager.updateAppWidget(getWidgetId(), remoteViews)
    }
}

建议:思考应用可以提供哪些简洁的实时信息。如果你的应用涉及实时状态,设计适合锁屏展示的 UI,有助于提升用户粘性。


4. 更细粒度的预测返回动画控制

预测返回手势在不断优化。Android 16 预计将提供更细粒度的控制能力,尤其是在 Jetpack Compose 中,使开发者可以根据手势进度实现自定义动画,而不仅限于默认效果。

增强版 PredictiveBackHandler 可能直接暴露手势进度。

示例:Jetpack Compose 自定义动画

@Composable
fun DeletableItem(modifier: Modifier = Modifier) {
    val scale = remember { Animatable(1f)
}

// Android 16 中增强的 PredictiveBackHandler 提供进度
PredictiveBackHandler { progress: Flow<Float> ->
        try {
            progress.collect { gestureProgress ->
                // 0.0 到 1.0
                scale.snapTo(1f - gestureProgress * 0.2f)
            }
            // 手势完成后执行删除
        } catch (e: CancellationException) {
            // 手势取消,恢复状态
            scale.animateTo(1f, spring(stiffness = Spring.StiffnessMedium))
        }
    }

    Box(
        modifier
            .scale(scale.value)
            .background(Color.Red)
            .fillMaxWidth()
            .height(50.dp)
    ) {
        // 内容
    }
}

建议:检查应用中的导航场景,考虑在哪些地方引入预测返回动画能提升体验,例如关闭弹窗、删除元素或页面返回。


5. 原生 Bluetooth LE Audio 广播 API

Bluetooth LE Audio 的 “Auracast” 功能支持一个设备向多个接收端广播音频,适用于健身房电视、会议或博物馆导览等场景。Android 16 预计将提供原生 API,使应用可以成为广播源。

示例:音频广播

val bluetoothManager = context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
val bluetoothLeBroadcaster = bluetoothManager.adapter.bluetoothLeBroadcaster

val broadcastMetadata = BroadcastMetadata.Builder()
    .setBroadcastName("Museum Tour - Exhibit A")
    .setAudioConfig(BroadcastAudioConfig.Builder().setCodec(AUDIO_CODEC_LC3).build())
    .build()

val broadcastCallback = object : BroadcastCallback() {
    override fun onBroadcastStarted(reason: Int, broadcastId: Int) {
        // 广播开始
    }
    override fun onBroadcastStopped(reason: Int, broadcastId: Int) {
       // 广播结束
    }
}

// 需在前台启动
bluetoothLeBroadcaster.startBroadcast(broadcastMetadata, audioStream, broadcastCallback)

// 停止广播:
// bluetoothLeBroadcaster.stopBroadcast(broadcastId)

建议:思考应用是否适合一对多音频场景,这可能带来新的业务机会。


6. 工作负载性能声明式 API

目前系统会自动推测应用性能需求(如交互时提升 CPU)。但这并不总是高效。Android 16 预计引入 声明式工作负载 API,允许应用明确声明当前任务类型,系统据此优化资源分配。

示例:声明不同类型工作负载

val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager

// 场景 1:后台同步
val backgroundWorkloadRequest = PowerManager.WorkloadRequest.Builder()
    .setWorkloadType(PowerManager.WorkloadRequest.WORKLOAD_TYPE_BACKGROUND)
    .setHint(PowerManager.WorkloadRequest.HINT_LOW_LATENCY, false)
    .build()

val backgroundSession = powerManager.acquireWorkloadSession(backgroundWorkloadRequest)
// 执行同步
backgroundSession.release()

// 场景 2:前台图像处理
val uiWorkloadRequest = PowerManager.WorkloadRequest.Builder()
    .setWorkloadType(PowerManager.WorkloadRequest.WORKLOAD_TYPE_UI_INTERACTIVE)
    .setHint(PowerManager.WorkloadRequest.HINT_CPU_INTENSIVE, true)
    .build()

val uiSession = powerManager.acquireWorkloadSession(uiWorkloadRequest)
// 执行计算
uiSession.release()

建议:梳理应用中的任务类型(实时 vs 后台),为未来接入该 API 做准备,从而提升性能与续航表现。


7. 视频 Ultra HDR

Android 14 引入了图片 Ultra HDR,Android 16 预计扩展至 视频,支持 10-bit HDR 视频,提供更高亮度、更深对比和更丰富色彩。

涉及 MediaRecorderCamera2 API 的新能力。

示例:检测 HDR 支持

val cameraManager = context.getSystemService(Context.CAMERA_SERVICE) as CameraManager
val characteristics = cameraManager.getCameraCharacteristics("0")

val capabilities = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
if (capabilities?.contains(CameraMetadata.REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT) == true) {
    val isHdrProfileSupported = CamcorderProfile.hasProfile(CamcorderProfile.QUALITY_HIGH_HDR10)
}

建议:如涉及视频能力,提前适配 HDR,包括采集与显示。


8. 更深度的 Health Connect 集成

Health Connect 正逐渐成为系统核心能力。Android 16 预计进一步简化 API 和权限流程。

示例:简化数据读取

val healthConnectClient = HealthConnectClient.get()

if (healthConnectClient.hasPermissions(setOf(StepsRecord.PERMISSION_READ))) {
    try {
        val today = ZonedDateTime.now().truncatedTo(ChronoUnit.DAYS)
        val request = ReadRecordsRequest(
            recordType = StepsRecord::class,
            timeRangeFilter = TimeRangeFilter.between(today.toInstant(), ZonedDateTime.now().toInstant())
        )
        val response = healthConnectClient.readRecords(request)
        for (record in response.records) {
            // 处理数据
        }
    } catch (e: Exception) {
        // 异常处理
    }
}

建议:关注新 API,减少样板代码,提升用户体验一致性。