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

如何通过WearOS应用启动安卓手机上的指定自研应用?

解决WearOS启动安卓配套指定应用的问题

方案一:基于RemoteActivityHelper构建显式Intent调用

虽然RemoteActivityHelper常被用于隐式Intent,但其实可以通过指定目标应用的包名和组件名,构建显式Intent实现精准启动:

  1. 配置手机应用的Manifest
    给要启动的Activity添加自定义action,并设置exported="true"(Android 12+必须):
<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="com.your.package.action.LAUNCH_MY_APP" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
  1. Wear端代码实现
    通过节点连接获取绑定的手机设备,再传递显式Intent:
import androidx.wear.remote.interactions.RemoteActivityHelper
import android.content.Intent
import androidx.activity.ComponentActivity
import androidx.compose.foundation.layout.*
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import com.google.android.gms.wearable.NodeClient
import com.google.android.gms.wearable.Wearable

class WearMainActivity : ComponentActivity() {
    private lateinit var remoteActivityHelper: RemoteActivityHelper
    private lateinit var nodeClient: NodeClient

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        remoteActivityHelper = RemoteActivityHelper(this)
        nodeClient = Wearable.getNodeClient(this)

        setContent {
            Column(
                modifier = Modifier.fillMaxSize(),
                verticalArrangement = Arrangement.Center,
                horizontalAlignment = Alignment.CenterHorizontally
            ) {
                Button(onClick = { launchTargetPhoneApp() }) {
                    Text(text = "启动手机配套应用")
                }
            }
        }
    }

    private fun launchTargetPhoneApp() {
        val intent = Intent().apply {
            action = "com.your.package.action.LAUNCH_MY_APP"
            setPackage("com.your.phone.app.package") // 替换为手机应用的实际包名
            flags = Intent.FLAG_ACTIVITY_NEW_TASK
        }

        // 获取已连接的手机节点,发送启动请求
        nodeClient.connectedNodes.addOnSuccessListener { nodes ->
            nodes.firstOrNull()?.let { node ->
                remoteActivityHelper.startRemoteActivity(intent, node.id)
            }
        }
    }
}

方案二:通过Wearable消息API触发启动

如果RemoteActivityHelper调用受限,可采用消息通信的方式,由Wear端发指令,手机端监听并自启动:

  1. Wear端发送启动指令
private fun sendLaunchCommand() {
    nodeClient.connectedNodes.addOnSuccessListener { nodes ->
        nodes.firstOrNull()?.let { node ->
            Wearable.getMessageClient(this).sendMessage(
                node.id,
                "/trigger_launch",
                ByteArray(0)
            )
        }
    }
}
  1. 手机端监听消息并启动
    创建监听服务:
import com.google.android.gms.wearable.WearableListenerService
import com.google.android.gms.wearable.MessageEvent
import android.content.Intent

class LaunchListenerService : WearableListenerService() {
    override fun onMessageReceived(messageEvent: MessageEvent) {
        super.onMessageReceived(messageEvent)
        if (messageEvent.path == "/trigger_launch") {
            // 启动自身应用主Activity
            val launchIntent = packageManager.getLaunchIntentForPackage(packageName)?.apply {
                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
            }
            launchIntent?.let { startActivity(it) }
        }
    }
}

并在手机应用Manifest中注册服务:

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

关键注意事项

  • 确保Wear应用与手机应用签名一致,否则会触发权限拦截。
  • 手机端Activity必须开启exported="true",否则无法被外部调用。
  • 需处理无连接节点的异常场景,比如给用户弹出"未连接手机"的提示。

内容的提问来源于stack exchange,提问作者Merajul Arefin Pial

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:35:27