如何通过WearOS应用启动安卓手机上的指定自研应用?
解决WearOS启动安卓配套指定应用的问题
方案一:基于RemoteActivityHelper构建显式Intent调用
虽然RemoteActivityHelper常被用于隐式Intent,但其实可以通过指定目标应用的包名和组件名,构建显式Intent实现精准启动:
- 配置手机应用的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>
- 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端发指令,手机端监听并自启动:
- Wear端发送启动指令
private fun sendLaunchCommand() { nodeClient.connectedNodes.addOnSuccessListener { nodes -> nodes.firstOrNull()?.let { node -> Wearable.getMessageClient(this).sendMessage( node.id, "/trigger_launch", ByteArray(0) ) } } }
- 手机端监听消息并启动
创建监听服务:
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
相关产品推荐
相关产品推荐

