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

如何从手机应用启动已终止的Wear OS应用并开启训练会话?

问题

开发一款与Wear OS应用交互的Android手机应用,需求是:当用户在手机端发起训练时,自动唤醒已终止的Wear OS应用并直接启动训练会话,实现流程:手机(启动训练)→ Wear OS应用(触发打开+启动训练)

已尝试的方案

  • Data Layer API:研究过手机与Wear OS的Data Layer通信API,但未找到唤醒已终止应用的方法
  • WearableListenerService:已在Wear OS应用中实现WearableListenerService接收消息,但不清楚如何触发应用启动并开启训练(即使应用未运行)

手机端发送消息的代码:

// 向Wear OS应用发送消息的代码
val node = nodes[0]
val payload = "start_workout".toByteArray()
Wearable.getMessageClient(context).sendMessage(node.id, "/start_workout", payload)
        .addOnSuccessListener {
            Log.d("TAG", "消息发送成功")
        }
        .addOnFailureListener {
            Log.d("TAG", "消息发送失败")
        }

解决方案

1. Wear OS端配置与逻辑实现

(1)正确注册WearableListenerService

WearableListenerService在收到Data Layer消息时,系统会自动拉起应用进程(即使应用已被终止),但必须在Manifest中正确注册该Service,设置android:exported="true"并指定消息过滤规则:

<service
    android:name=".MyWearListenerService"
    android:exported="true">
    <intent-filter>
        <action android:name="com.google.android.gms.wearable.MESSAGE_RECEIVED" />
        <data
            android:host="*"
            android:pathPrefix="/start_workout"
            android:scheme="wear" />
    </intent-filter>
</service>

(2)处理消息并启动训练页面

在自定义的MyWearListenerService中,重写onMessageReceived方法,收到启动训练的消息后直接打开训练Activity,注意添加FLAG_ACTIVITY_NEW_TASK标记(从Service启动Activity必须设置):

class MyWearListenerService : WearableListenerService() {
    override fun onMessageReceived(messageEvent: MessageEvent) {
        super.onMessageReceived(messageEvent)
        if (messageEvent.path == "/start_workout") {
            // 解析消息payload,可传递训练类型等参数
            val workoutType = String(messageEvent.data)
            
            // 启动训练Activity
            val intent = Intent(this, WorkoutActivity::class.java).apply {
                putExtra("WORKOUT_TYPE", workoutType)
                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
            }
            startActivity(intent)
        }
    }
}

2. 手机端发送逻辑优化

确保正确获取已连接的Wear设备节点,建议遍历所有节点或让用户选择目标设备,发送消息的路径要和Wear端的过滤规则一致:

// 获取已连接的Wear设备节点
Wearable.getNodeClient(context).connectedNodes.addOnSuccessListener { nodes ->
    nodes.forEach { node ->
        val payload = "running".toByteArray() // 传递具体训练类型参数
        Wearable.getMessageClient(context).sendMessage(
            node.id,
            "/start_workout",
            payload
        ).addOnSuccessListener {
            Log.d("TAG", "向设备 ${node.displayName} 发送启动训练消息成功")
        }.addOnFailureListener {
            Log.e("TAG", "发送消息失败", it)
        }
    }
}

关键注意事项

  • 手机应用与Wear OS应用必须签名一致,且都添加了Data Layer依赖(com.google.android.gms:play-services-wearable)
  • 若Wear设备处于低功耗模式,消息接收可能延迟,可结合onPeerConnected等回调做补充处理
  • 测试前需确保手机与Wear设备已配对且连接正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:33:22