MainActivity2触发onBackPressed时如何自动点击MainActivity1的webview内按钮
可行实现方案
不要直接持有MainActivity1的实例触发操作,会引发内存泄漏,以下是合规的实现方案:
方案1:基于ActivityResult回调实现(最推荐,无额外依赖)
适用于从MainActivity1启动MainActivity2的场景,是Android官方推荐的跨Activity回传数据的方式:
- MainActivity1中添加启动和接收结果的逻辑:
private static final int REQ_CODE_MAIN2 = 1001; // 启动MainActivity2的代码 private void goToMain2() { startActivityForResult(new Intent(this, MainActivity2.class), REQ_CODE_MAIN2); } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQ_CODE_MAIN2 && resultCode == RESULT_OK) { // 触发WebView内按钮点击,需替换为你实际的blogid值 main1WebView.evaluateJavascript("$('#sdf_" + 实际的blogid值 + "').click()", null); } }
- 修改MainActivity2的onBackPressed逻辑:
public void onBackPressed() { if (Config.EXIT_APP_BY_BACK_BUTTON_ALWAYS) { setResult(RESULT_OK); super.onBackPressed(); } }
方案2:基于本地广播实现
不需要修改启动逻辑,实现更灵活:
- MainActivity1中注册广播接收器:
public static final String ACTION_TRIGGER_BTN_CLICK = "你的包名.TRIGGER_BTN_CLICK"; private BroadcastReceiver triggerReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // 触发WebView内按钮点击 main1WebView.evaluateJavascript("$('#sdf_" + 实际的blogid值 + "').click()", null); } }; @Override protected void onStart() { super.onStart(); IntentFilter filter = new IntentFilter(ACTION_TRIGGER_BTN_CLICK); // 推荐用LocalBroadcastManager,仅应用内接收,更安全 LocalBroadcastManager.getInstance(this).registerReceiver(triggerReceiver, filter); } @Override protected void onStop() { super.onStop(); LocalBroadcastManager.getInstance(this).unregisterReceiver(triggerReceiver); }
- 修改MainActivity2的onBackPressed逻辑:
public void onBackPressed() { if (Config.EXIT_APP_BY_BACK_BUTTON_ALWAYS) { Intent intent = new Intent(MainActivity1.ACTION_TRIGGER_BTN_CLICK); LocalBroadcastManager.getInstance(this).sendBroadcast(intent); super.onBackPressed(); } }
方案3:基于EventBus实现
如果你的项目已经接入EventBus,用这种方式代码最简洁:
- 定义事件类:
public class TriggerMain1BtnEvent {}
- MainActivity1中注册订阅:
@Override protected void onStart() { super.onStart(); EventBus.getDefault().register(this); } @Override protected void onStop() { super.onStop(); EventBus.getDefault().unregister(this); } @Subscribe(threadMode = ThreadMode.MAIN) public void onTriggerEvent(TriggerMain1BtnEvent event) { main1WebView.evaluateJavascript("$('#sdf_" + 实际的blogid值 + "').click()", null); }
- 修改MainActivity2的onBackPressed逻辑:
public void onBackPressed() { if (Config.EXIT_APP_BY_BACK_BUTTON_ALWAYS) { EventBus.getDefault().post(new TriggerMain1BtnEvent()); super.onBackPressed(); } }
注意事项
- 需确保MainActivity1的WebView已开启JavaScript支持:
webView.getSettings().setJavaScriptEnabled(true) - 执行JS操作必须在主线程调用,以上三种方案默认回调都在主线程,无需额外切线程
- 需确保你传入的blogid值和页面渲染的按钮id一致,否则JS选择器找不到元素无法触发点击
内容的提问来源于stack exchange,提问作者Jarosław Król
相关产品推荐
相关产品推荐

