如何在自定义Capacitor插件中触发新Activity并获取返回结果?
在Capacitor自定义插件中启动Activity并获取返回结果的解决方案
完全可以实现,核心是借助Capacitor插件能获取当前Activity实例的特性,结合Android的ActivityResultLauncher处理启动和结果回调,具体实现如下:
核心思路
Capacitor的Plugin类提供getActivity()方法可获取当前绑定的Activity实例,我们在插件生命周期方法中注册Activity结果回调,在插件调用方法中启动目标Activity,最后通过PluginCall将结果回调给前端。
实现步骤与代码示例
1. 定义插件类并注册Activity结果回调
在插件的onAttach方法中注册ActivityResultLauncher,该方法会在插件绑定到Activity时触发,适合做初始化操作:
import com.getcapacitor.*; import com.getcapacitor.annotation.PluginMethod; import android.app.Activity; import android.content.Intent; import androidx.activity.result.ActivityResultLauncher; import androidx.activity.result.contract.ActivityResultContracts; @NativePlugin public class PlaidLinkPlugin extends Plugin { private ActivityResultLauncher<Intent> plaidActivityLauncher; private PluginCall pendingCall; @Override public void onAttach(Activity activity) { super.onAttach(activity); // 注册Activity结果回调 plaidActivityLauncher = activity.registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (pendingCall == null) return; if (result.getResultCode() == Activity.RESULT_OK) { Intent data = result.getData(); if (data != null) { // 提取Plaid返回的核心数据,如public_token String publicToken = data.getStringExtra("public_token"); JSObject response = new JSObject(); response.put("publicToken", publicToken); pendingCall.resolve(response); } else { pendingCall.reject("Plaid未返回有效数据"); } } else { pendingCall.reject("Plaid Link已取消或启动失败"); } // 清空引用,避免内存泄漏 pendingCall = null; } ); }
2. 实现插件调用方法,启动Plaid Activity
添加带@PluginMethod注解的方法,接收前端调用请求,构建Plaid的Intent并启动:
@PluginMethod public void openPlaidLink(PluginCall call) { pendingCall = call; // 根据plaid-link-android文档构建Intent Intent plaidIntent = new Intent(getActivity(), PlaidLinkActivity.class); // 配置Plaid必要参数,根据实际需求调整 plaidIntent.putExtra("client_name", "你的应用名称"); plaidIntent.putExtra("public_key", "你的Plaid公钥"); plaidIntent.putExtra("env", "sandbox"); plaidIntent.putExtra("product", new String[]{"auth", "transactions"}); // 启动Plaid界面 plaidActivityLauncher.launch(plaidIntent); } }
注意事项
- 内存泄漏防护:处理完结果后必须将
pendingCall置为null,防止Activity销毁后仍持有引用。 - 多请求处理:若插件需同时处理多个调用,建议用
Map<String, PluginCall>存储call.getId()与对应PluginCall的映射,替代单个pendingCall变量。 - 参数校验:严格按照plaid-link-android官方文档配置Intent参数,否则可能导致Plaid界面无法正常启动。
- 权限配置:确保
AndroidManifest.xml中声明Plaid所需权限(如网络权限),必要时在插件中添加权限请求逻辑。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

