You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询Google新发布的ActivityTransition API的使用示例

当然有!我刚好用过这个API来实现运动状态的切换监听,下面给你一套完整的示例,涵盖从权限配置到回调处理的全流程:

ActivityTransition API 使用示例

1. 先配置必要权限

首先要在AndroidManifest.xml中添加位置权限,如果需要后台监听的话,还要加上后台位置权限:

<!-- 基础位置权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 后台监听需要的权限(Android 10+) -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

2. 创建过渡监听请求

我们需要定义要监听哪些活动状态的切换(比如“开始走路”“停止跑步”这类事件),通过ActivityTransitionRequest来封装这些规则:

import com.google.android.gms.location.ActivityTransition
import com.google.android.gms.location.ActivityTransitionRequest
import com.google.android.gms.location.DetectedActivity

fun createTransitionRequest(): ActivityTransitionRequest {
    // 定义要监听的过渡事件:走路开始/结束、跑步开始/结束
    val transitions = listOf(
        // 当从非走路状态切换到走路状态时触发
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.WALKING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build(),
        // 当从走路状态切换到非走路状态时触发
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.WALKING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build(),
        // 跑步状态进入
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.RUNNING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
            .build(),
        // 跑步状态退出
        ActivityTransition.Builder()
            .setActivityType(DetectedActivity.RUNNING)
            .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
            .build()
    )
    return ActivityTransitionRequest(transitions)
}

3. 实现过渡回调处理

接下来要创建一个BroadcastReceiver来接收过渡事件的回调(也可以用Service,看你的场景需求):

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.google.android.gms.location.ActivityTransitionResult

class TransitionReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        // 验证是否是ActivityTransition的回调结果
        if (ActivityTransitionResult.hasResult(intent)) {
            val result = ActivityTransitionResult.extractResult(intent)
            result?.transitionEvents?.forEach { event ->
                // 处理每个过渡事件
                val activityType = when(event.activityType) {
                    DetectedActivity.WALKING -> "走路"
                    DetectedActivity.RUNNING -> "跑步"
                    else -> "未知活动"
                }
                val transitionType = if(event.transitionType == ActivityTransition.ACTIVITY_TRANSITION_ENTER) {
                    "开始"
                } else {
                    "结束"
                }
                // 这里可以替换成你的业务逻辑,比如更新UI、发送通知等
                println("检测到:${transitionType}${activityType}")
            }
        }
    }
}

4. 注册与移除监听

在你的Activity或者Service中,使用ActivityTransitionClient来注册监听,记得先检查权限:

import android.Manifest
import android.content.pm.PackageManager
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import com.google.android.gms.location.ActivityTransitionClient
import com.google.android.gms.location.LocationServices
import android.app.PendingIntent

class MainActivity : AppCompatActivity() {
    private lateinit var transitionClient: ActivityTransitionClient
    private val receiverPendingIntent by lazy {
        Intent(this, TransitionReceiver::class.java).let { intent ->
            PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        transitionClient = LocationServices.getActivityTransitionClient(this)
    }

    // 注册监听
    fun startTransitionListening() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // 先请求权限
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 1001)
            return
        }
        val request = createTransitionRequest()
        transitionClient.requestActivityTransitionUpdates(request, receiverPendingIntent)
            .addOnSuccessListener {
                println("监听注册成功")
            }
            .addOnFailureListener {
                println("监听注册失败:${it.message}")
            }
    }

    // 移除监听
    fun stopTransitionListening() {
        transitionClient.removeActivityTransitionUpdates(receiverPendingIntent)
            .addOnSuccessListener {
                println("监听已移除")
            }
    }

    override fun onDestroy() {
        super.onDestroy()
        stopTransitionListening()
    }
}

一些关键注意事项

  • 权限检查:Android 10及以上版本,后台监听需要额外申请ACCESS_BACKGROUND_LOCATION权限,且需要用户主动授权。
  • 设备兼容性:这个API依赖Google Play Services,要确保设备上安装了最新版本的Google Play服务。
  • 耗电优化:过度的监听可能会增加耗电,建议只监听你需要的活动类型,不需要时及时移除监听。

内容的提问来源于stack exchange,提问作者user9187

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:25:06