You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MainActivity2触发onBackPressed时如何自动点击MainActivity1的webview内按钮

可行实现方案

不要直接持有MainActivity1的实例触发操作,会引发内存泄漏,以下是合规的实现方案:

方案1:基于ActivityResult回调实现(最推荐,无额外依赖)

适用于从MainActivity1启动MainActivity2的场景,是Android官方推荐的跨Activity回传数据的方式:

  1. 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);
    }
}
  1. 修改MainActivity2的onBackPressed逻辑:
public void onBackPressed() {
    if (Config.EXIT_APP_BY_BACK_BUTTON_ALWAYS) {
        setResult(RESULT_OK);
        super.onBackPressed();
    }
}

方案2:基于本地广播实现

不需要修改启动逻辑,实现更灵活:

  1. 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);
}
  1. 修改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,用这种方式代码最简洁:

  1. 定义事件类:
public class TriggerMain1BtnEvent {}
  1. 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);
}
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:09:00