Android中通过deep link重新打开fragment时如何保留原有状态?
Android Fragment DeepLink返回数据丢失解决方案
问题根因
- DeepLink触发时默认会新启动目标Fragment的宿主Activity,原有的Activity实例被销毁或触发重建流程,仅首次启动时从Bundle获取的临时数据没有持久化,返回后自然丢失
- 跳转网页时未做Fragment状态留存,重建后的Fragment无法恢复原有页面数据
可行解决方案
方案1:配置DeepLink启动模式复用原有实例(优先推荐)
修改AndroidManifest中宿主Activity的配置,避免DeepLink返回时新建Activity实例:
<activity android:name=".YourPayHostActivity" android:launchMode="singleTask" <!-- 核心配置,有已存在的实例就直接复用 --> android:exported="true"> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:host="paycallback" android:scheme="yourAppCustomScheme" /> </intent-filter> </activity>
该方案改造成本极低,原有Fragment实例不会销毁,页面数据会完整保留,仅需要在宿主Activity的
onNewIntent方法中接收支付回调的参数处理后续逻辑即可。
方案2:Fragment状态持久化(适合无法修改启动模式的场景)
重写Fragment的onSaveInstanceState方法存储当前页面数据:
override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // 把需要保留的所有页面字段存入Bundle outState.putString("order_id", currentOrderId) outState.putParcelable("order_info", currentOrderInfo) // 其他需要保留的字段依次存入 }
Fragment初始化时优先从savedInstanceState取数据,取不到再读取初始Bundle参数:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) currentOrderInfo = if (savedInstanceState != null) { savedInstanceState.getParcelable("order_info") } else { arguments?.getParcelable("init_order_info") } // 执行页面渲染逻辑 }
方案3:全局临时缓存(适合跨页面共享的订单类数据)
通过全局单例类临时存储支付相关数据,DeepLink返回后优先读取缓存数据:
// 全局缓存工具类示例 object PayTempCache { var currentPayOrder: OrderInfo? = null } // 跳转网页前存入当前页面数据 PayTempCache.currentPayOrder = currentOrderInfo // Fragment初始化时读取数据 currentOrderInfo = PayTempCache.currentPayOrder ?: arguments?.getParcelable("init_order_info") // 支付流程全部完成后清除缓存避免内存泄露 PayTempCache.currentPayOrder = null
内容的提问来源于stack exchange,提问作者Asoodeh
相关产品推荐
相关产品推荐

