startActivityForResult已弃用,求基于ActivityX的新API适配方案
适配已弃用的startActivityForResult,改用Activity Result API
AndroidX 推荐使用Activity Result API替代已弃用的startActivityForResult和onActivityResult,以下是针对你现有代码的完整适配方案:
1. 定义全局的ActivityResultLauncher
在你的Activity类中添加一个全局的ActivityResultLauncher,用来绑定启动Activity后的回调逻辑(替代原来的onActivityResult):
private final ActivityResultLauncher<Intent> addPackLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { // 原onActivityResult中的逻辑完全迁移到这里 if (result.getResultCode() == Activity.RESULT_CANCELED) { Intent data = result.getData(); if (data != null) { final String validationError = data.getStringExtra("validation_error"); if (validationError != null) { if (BuildConfig.DEBUG) { MessageDialogFragment.newInstance(R.string.title_validation_error, validationError) .show(getSupportFragmentManager(), "validation error"); } Log.e(TAG, "Validation failed:" + validationError); } } else { new StickerPackNotAddedMessageFragment() .show(getSupportFragmentManager(), "sticker_pack_not_added"); } } } );
2. 修改第一个启动Activity的方法
替换原来的startActivityForResult调用为launcher.launch():
private void launchIntentToAddPackToSpecificPackage(String identifier, String stickerPackName, String whatsappPackageName) { Intent intent = createIntentToAddStickerPack(identifier, stickerPackName); intent.setPackage(whatsappPackageName); try { addPackLauncher.launch(intent); } catch (ActivityNotFoundException e) { Toast.makeText(this, R.string.add_pack_fail_prompt_update_whatsapp, Toast.LENGTH_LONG).show(); } }
3. 修改第二个启动Activity的方法
同样替换startActivityForResult调用:
//处理WhatsApp被设为默认应用的情况,仍希望用户看到两个选项 private void launchIntentToAddPackToChooser(String identifier, String stickerPackName) { Intent intent = createIntentToAddStickerPack(identifier, stickerPackName); try { addPackLauncher.launch(Intent.createChooser(intent, getString(R.string.add_to_whatsapp))); } catch (ActivityNotFoundException e) { Toast.makeText(this, R.string.add_pack_fail_prompt_update_whatsapp, Toast.LENGTH_LONG).show(); } }
4. 删除旧的onActivityResult方法
原有的onActivityResult方法可以直接删除,因为逻辑已经完全迁移到ActivityResultLauncher的回调中。
注意事项
- 确保你的Activity继承自
AppCompatActivity(AndroidX标准Activity),registerForActivityResult方法仅在AndroidX组件中可用。 - 无需再使用
ADD_PACK常量,回调与launcher直接绑定,不需要通过requestCode区分请求。 - 原有的异常捕获逻辑完全保留,不影响原有业务提示。
内容的提问来源于stack exchange,提问作者Amator425
相关产品推荐
相关产品推荐

