0

0

AdMob 插页式广告加载与显示指南:解决广告不显示问题

DDD

DDD

发布时间:2025-10-07 12:35:12

|

697人浏览过

|

来源于php中文网

原创

AdMob 插页式广告加载与显示指南:解决广告不显示问题

本文旨在解决 AdMob 插页式广告在 Android 应用中不显示的问题。核心在于理解广告加载的异步性,并确保在广告完全加载成功后才尝试显示。教程将详细讲解正确的广告加载、回调处理及显示时机,并提供优化的代码示例,帮助开发者构建稳定的广告集成方案。

1. 理解 AdMob 插页式广告的加载机制

admob 插页式广告的加载是一个异步过程。这意味着当你调用 interstitialad.load() 方法时,广告并不会立即可用。系统会在后台请求广告,并在成功或失败时通过回调通知你的应用。在广告加载完成之前,尝试显示广告将导致 interstitialad 对象为 null 或未准备好,从而广告无法显示。

原始代码中出现的问题正是由于未能正确处理这种异步性:

// 在这里你开始加载广告
mInterstitialAd = adsManager.loadInterstatialAd();

// 紧接着你试图显示广告
if (mInterstitialAd != null) {
    mInterstitialAd.show(ColoringActivity.this);
}

在 adsManager.loadInterstatialAd() 调用之后,mInterstitialAd 变量在绝大多数情况下仍然是 null,因为广告加载请求还在进行中,onAdLoaded 回调尚未触发。因此,if (mInterstitialAd != null) 条件判断失败,广告也就永远不会显示。

2. 正确的广告加载与显示流程

为了确保插页式广告能够正确显示,我们需要遵循以下步骤:

  1. 初始化 AdMob SDK: 在应用启动时完成 SDK 初始化。
  2. 加载广告: 在需要显示广告之前,提前调用加载方法。例如,在 Activity 的 onCreate() 或用户完成某个操作后。
  3. 等待加载完成: 通过 InterstitialAdLoadCallback 监听广告加载结果。
  4. 显示广告: 仅当 onAdLoaded() 回调被触发,表明广告已成功加载并准备就绪时,才调用 InterstitialAd.show() 方法。
  5. 处理广告生命周期回调: 通过 FullScreenContentCallback 监听广告的显示、关闭、点击等事件,并在此处管理广告对象的生命周期,例如在广告关闭后将 mInterstitialAd 置为 null 以便下次重新加载。

3. 优化 AdsManager 类

为了更好地管理广告的加载和显示,我们可以对 AdsManager 类进行优化,使其能够异步地处理广告加载,并在广告准备就绪时提供显示接口。

import android.app.Activity;
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import com.google.android.gms.ads.AdError;
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.FullScreenContentCallback;
import com.google.android.gms.ads.LoadAdError;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.interstitial.InterstitialAd;
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;

public class AdsManager {

    private static final String TAG = "AdsManager";
    private Context context;
    private InterstitialAd mInterstitialAd;
    private boolean isAdLoading = false; // 标记是否正在加载广告

    public AdsManager(Context context) {
        this.context = context.getApplicationContext(); // 使用 ApplicationContext 避免内存泄漏
        MobileAds.initialize(context, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(@NonNull InitializationStatus initializationStatus) {
                Log.d(TAG, "AdMob SDK initialized.");
            }
        });
    }

    /**
     * 加载插页式广告。
     * 广告加载是异步的,不应立即尝试显示。
     */
    public void loadInterstitialAd() {
        if (mInterstitialAd != null || isAdLoading) {
            Log.d(TAG, "Interstitial ad is already loaded or currently loading.");
            return;
        }

        isAdLoading = true;
        AdRequest adRequest = new AdRequest.Builder().build();

        InterstitialAd.load(context, "ca-app-pub-3940256099942544/1033173712", // 使用测试广告单元ID
                adRequest, new InterstitialAdLoadCallback() {
                    @Override
                    public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) {
                        Log.e(TAG, "Interstitial ad failed to load: " + loadAdError.getMessage());
                        mInterstitialAd = null;
                        isAdLoading = false;
                    }

                    @Override
                    public void onAdLoaded(@NonNull InterstitialAd interstitialAd) {
                        Log.d(TAG, "Interstitial ad loaded successfully.");
                        mInterstitialAd = interstitialAd;
                        isAdLoading = false;

                        // 设置全屏内容回调,处理广告的生命周期事件
                        mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() {
                            @Override
                            public void onAdClicked() {
                                Log.d(TAG, "Ad was clicked.");
                            }

                            @Override
                            public void onAdDismissedFullScreenContent() {
                                Log.d(TAG, "Ad was dismissed.");
                                // 广告关闭后,将广告对象置为null,以便下次重新加载
                                mInterstitialAd = null;
                                loadInterstitialAd(); // 可选:在广告关闭后立即预加载下一个广告
                            }

                            @Override
                            public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
                                Log.e(TAG, "Ad failed to show: " + adError.getMessage());
                                // 广告显示失败,将广告对象置为null
                                mInterstitialAd = null;
                            }

                            @Override
                            public void onAdImpression() {
                                Log.d(TAG, "Ad recorded an impression.");
                            }

                            @Override
                            public void onAdShowedFullScreenContent() {
                                Log.d(TAG, "Ad showed full screen content.");
                                // 广告已显示,通常在这里可以将mInterstitialAd置为null,准备加载下一个
                                // 但更推荐在 onAdDismissedFullScreenContent 中处理,因为广告显示后用户可能未立即关闭
                            }
                        });
                    }
                });
    }

    /**
     * 显示插页式广告(如果已加载并准备就绪)。
     * 只有在广告加载成功后才能调用此方法。
     *
     * @param activity 用于显示广告的 Activity。
     * @return 如果广告成功显示,返回 true;否则返回 false。
     */
    public boolean showInterstitialAd(Activity activity) {
        if (mInterstitialAd != null) {
            mInterstitialAd.show(activity);
            Log.d(TAG, "Interstitial ad is being shown.");
            return true;
        } else {
            Log.d(TAG, "Interstitial ad is not ready to be shown.");
            // 如果广告未准备好,可以尝试重新加载
            loadInterstitialAd();
            return false;
        }
    }

    /**
     * 检查插页式广告是否已加载并准备就绪。
     * @return 如果广告已加载,返回 true;否则返回 false。
     */
    public boolean isAdLoaded() {
        return mInterstitialAd != null;
    }
}

4. 在 Activity 中正确调用

在 Activity 中,您应该在合适的时机加载广告,并在用户触发特定事件时尝试显示广告。

Kaiber
Kaiber

Kaiber是一个视频生成引擎,用户可以根据自己的图片或文字描述创建视频

下载
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;

public class ColoringActivity extends AppCompatActivity {

    private AdsManager adsManager;
    private Button showAdButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_coloring); // 假设您的布局文件名为 activity_coloring

        adsManager = new AdsManager(this);
        // 在 Activity 创建时预加载插页式广告
        adsManager.loadInterstitialAd();

        showAdButton = findViewById(R.id.show_ad_button); // 假设您有一个按钮用于显示广告
        if (showAdButton != null) {
            showAdButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 当用户点击按钮时,尝试显示广告
                    if (adsManager.showInterstitialAd(ColoringActivity.this)) {
                        // 广告已显示,可以在这里暂停游戏或执行其他操作
                    } else {
                        // 广告未准备好,可能需要提示用户或等待
                        // adsManager.showInterstitialAd() 内部已经尝试重新加载
                        // 可以在这里显示一个Toast提示用户稍等
                        // Toast.makeText(ColoringActivity.this, "广告正在加载中,请稍候...", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        // 可以在这里再次检查广告是否加载,如果未加载则重新加载
        // 确保每次Activity回到前台时,都有广告可供显示
        if (!adsManager.isAdLoaded()) {
            adsManager.loadInterstitialAd();
        }
    }
}

布局文件 (activity_coloring.xml) 示例:




    

    

5. 其他重要配置与注意事项

  • AndroidManifest.xml 配置: 确保您的 AndroidManifest.xml 文件中包含正确的权限和 AdMob 应用 ID。

    
    
    
    
        
        
        
        
    

    注意: 原始问题中的 uses-permission android:name="android.permission.VIBRATE" 与 AdMob 无直接关系,INTERNET 权限是必需的。

  • Gradle 依赖: 在您的 build.gradle (Module: app) 文件中,确保添加了 AdMob SDK 依赖。

    dependencies {
        implementation 'com.google.android.gms:play-services-ads:22.x.x' // 使用最新稳定版本
    }

    请将 22.x.x 替换为当前最新的稳定版本。

  • 测试广告单元 ID: 在开发和测试阶段,务必使用 Google 提供的测试广告单元 ID (ca-app-pub-3940256099942544/1033173712 用于插页式广告)。这可以避免无效流量对您的 AdMob 账户产生影响。只有在应用发布前,才替换为您的实际广告单元 ID。

  • 广告预加载: 为了提供更好的用户体验,建议在用户可能需要查看广告之前就预加载广告。例如,在 Activity 启动时加载,或在用户完成一个游戏关卡后立即加载下一个广告。

  • 内存管理: 在 AdsManager 中使用 context.getApplicationContext() 可以帮助避免 Activity 内存泄漏,因为 ApplicationContext 的生命周期与应用相同,而 Activity Context 的生命周期较短。

总结

解决 AdMob 插页式广告不显示问题的关键在于正确处理其异步加载机制。通过将广告加载与显示逻辑分离,确保在 onAdLoaded 回调触发后才尝试显示广告,并利用 FullScreenContentCallback 管理广告生命周期,可以有效构建一个稳定可靠的 AdMob 广告集成方案。遵循本教程中的代码结构和最佳实践,将帮助您避免常见的集成陷阱,确保广告能够顺利展示。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

229

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

434

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

713

2023.08.22

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1852

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2080

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

924

2024.11.28

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

994

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

53

2025.10.17

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 10.4万人学习

Java 教程
Java 教程

共578课时 | 41万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号