咨询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
相关产品推荐
相关产品推荐

