如何从手机应用启动已终止的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
相关产品推荐
相关产品推荐

