Unity Activity无法返回结果求助:startActivityForResult返回Intent为空
嘿,我之前也踩过Unity Activity返回结果为空的坑!你的问题核心大概率是在onDestroy里设置返回结果太晚了——Android系统在Activity走到onDestroy之前,可能已经把默认的空结果回传给调用方了,这时候再设置结果根本不会被捕获。
先说说问题根源
当你用startActivityForResult启动Activity时,系统会等待目标Activity调用setResult()后,在finish()阶段把结果打包返回。但onDestroy是Activity生命周期的最后一步,此时系统已经完成了结果传递的流程,就算你在这里设置了数据,主应用也拿不到了。另外,mUnityPlayer.quit()内部可能已经触发了Activity的销毁逻辑,这时候再补设结果完全赶不上趟。
具体解决方案
1. 把设置结果的逻辑提前到mUnityPlayer.quit()之前
不要等到onDestroy,在触发Unity退出的时机(比如Unity侧的退出回调、自定义退出按钮点击)就先设置好结果,再执行退出和finish:
// 示例:自定义一个退出Unity并返回结果的方法 public void exitUnityWithResult() { // 1. 先构建要返回的Intent数据 Intent resultIntent = new Intent(); resultIntent.putExtra("session_id", "your_closed_session_id"); resultIntent.putExtra("status", "success"); setResult(RESULT_OK, resultIntent); // 2. 再调用UnityPlayer的退出方法 mUnityPlayer.quit(); // 3. 手动调用finish,确保Activity正常结束并传递结果 finish(); }
然后把onDestroy里的设置结果代码删掉,只保留必要的资源清理逻辑就行。
2. 检查UnityActivity的启动模式
去AndroidManifest.xml里看看你的UnityApplication配置,别用android:launchMode="singleInstance"或singleTask——这两种模式下Activity会跑在单独的任务栈里,startActivityForResult根本没法正常返回结果(系统会直接返回RESULT_CANCELED,Intent为空)。如果必须用特殊启动模式,就得换别的方式传数据,比如本地存储、EventBus或者全局静态变量。
3. 处理返回键退出的情况
如果用户是按返回键退出Unity Activity,重写onBackPressed()来提前设置结果:
@Override public void onBackPressed() { // 先设置返回结果 Intent resultIntent = new Intent(); resultIntent.putExtra("key", "your_data"); setResult(RESULT_OK, resultIntent); // 再执行Unity退出和Activity结束 mUnityPlayer.quit(); super.onBackPressed(); }
额外排查点
- 确认主应用的
onActivityResult()逻辑正确:检查请求码、结果码是否匹配,别漏了super.onActivityResult()的调用:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == YOUR_UNITY_REQUEST_CODE && resultCode == RESULT_OK) { if (data != null) { // 处理返回的数据 String sessionStatus = data.getStringExtra("status"); } } }
- 检查你的
closeSession()方法有没有提前触发finish(),如果这个方法里已经让Activity结束了,后续的设置结果操作自然无效。
内容的提问来源于stack exchange,提问作者Franz

