如何用单个WebView加载双URL并前置插页广告?解决广告后空白问题
解决插页广告关闭后WebView空白的问题
我来帮你梳理下问题根源和修改方案:核心问题是你原来的逻辑是直接通过Intent传URL并立即加载,但加入广告后,需要把URL加载的时机延后到广告关闭的回调中,同时要确保URL能正确传递、WebView配置无误。
下面分主页和WebView页面给出具体修改代码:
一、主页(MainActivity)修改
原来的按钮点击是直接跳转WebView页面,现在改成「点击按钮→展示插页广告→广告关闭后跳转并传递URL」的逻辑:
import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.InterstitialAd; import com.google.android.gms.ads.InterstitialAdLoadCallback; import com.google.android.gms.ads.MobileAds; import com.google.android.gms.ads.FullScreenContentCallback; import com.google.android.gms.ads.AdError; public class MainActivity extends AppCompatActivity { private InterstitialAd mInterstitialAd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化广告SDK MobileAds.initialize(this, initializationStatus -> {}); loadInterstitialAd(); // 按钮1:对应第一个URL findViewById(R.id.btn_open_url1).setOnClickListener(v -> { String targetUrl = "https://www.your-first-url.com"; showAdThenOpenWebView(targetUrl); }); // 按钮2:对应第二个URL findViewById(R.id.btn_open_url2).setOnClickListener(v -> { String targetUrl = "https://www.your-second-url.com"; showAdThenOpenWebView(targetUrl); }); } // 加载插页广告 private void loadInterstitialAd() { AdRequest adRequest = new AdRequest.Builder().build(); InterstitialAd.load(this, "你的广告单元ID", adRequest, new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { mInterstitialAd = interstitialAd; // 设置广告关闭后的回调 mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { // 广告关闭后,重新加载下一次的广告(可选,提升后续展示率) loadInterstitialAd(); } @Override public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { mInterstitialAd = null; loadInterstitialAd(); } }); } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { mInterstitialAd = null; } }); } // 展示广告后打开WebView页面 private void showAdThenOpenWebView(String targetUrl) { if (mInterstitialAd != null) { // 先展示广告,关闭后再跳转 mInterstitialAd.show(MainActivity.this); // 这里可以用全局变量或者临时存储URL,不过更稳妥的是在广告回调中传递?不,其实可以直接在show之后,等关闭回调触发时跳转,哦不对,应该把URL和广告绑定?不对,其实可以这样: // 哦,刚才的回调里没有URL参数,所以可以用一个临时变量或者修改回调方式,比如用自定义的接口?或者更简单的,把URL存在一个成员变量里,然后在onAdDismissedFullScreenContent中使用 // 修正:把targetUrl存为成员变量,或者用lambda捕获 String finalTargetUrl = targetUrl; mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { openWebViewActivity(finalTargetUrl); loadInterstitialAd(); } @Override public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { openWebViewActivity(finalTargetUrl); mInterstitialAd = null; loadInterstitialAd(); } }); mInterstitialAd.show(MainActivity.this); } else { // 广告未加载完成,直接跳转 openWebViewActivity(targetUrl); // 同时重新加载广告 loadInterstitialAd(); } } // 跳转WebView页面的通用方法 private void openWebViewActivity(String url) { Intent intent = new Intent(MainActivity.this, WebViewActivity.class); intent.putExtra("KEY_TARGET_URL", url); startActivity(intent); } }
二、WebView页面(WebViewActivity)修改
这里要确保WebView配置正确,并且在收到URL后能正常加载:
import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; public class WebViewActivity extends AppCompatActivity { private WebView mWebView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); mWebView = findViewById(R.id.web_view); configureWebView(); // 获取主页传递的URL并加载 String targetUrl = getIntent().getStringExtra("KEY_TARGET_URL"); if (targetUrl != null && !targetUrl.isEmpty()) { mWebView.loadUrl(targetUrl); } } // 配置WebView的必要设置 private void configureWebView() { WebSettings webSettings = mWebView.getSettings(); // 开启JavaScript(很多网页需要) webSettings.setJavaScriptEnabled(true); // 开启DOM存储(避免部分网页加载异常) webSettings.setDomStorageEnabled(true); // 设置WebViewClient,避免跳转到系统浏览器 mWebView.setWebViewClient(new WebViewClient()); // 支持缩放(可选) webSettings.setSupportZoom(true); webSettings.setBuiltInZoomControls(true); } // 处理返回键,让WebView返回上一页 @Override public void onBackPressed() { if (mWebView.canGoBack()) { mWebView.goBack(); } else { super.onBackPressed(); } } }
关键注意事项
- 替换代码中的
你的广告单元ID为你在AdMob后台申请的真实ID - 确保AndroidManifest.xml中添加了网络权限:
<uses-permission android:name="android.permission.INTERNET" /> - 广告加载是异步的,所以我们处理了「广告未加载完成时直接跳转」的情况,避免用户点击按钮无响应
- 核心修复点:把WebView的
loadUrl操作,绑定到广告的onAdDismissedFullScreenContent回调中,确保只有广告关闭后才开始加载URL
内容的提问来源于stack exchange,提问作者Nikhil Komalan
相关产品推荐
相关产品推荐

