Android 应用中 AdMob 广告的正确初始化姿势

胖静同学_8347

胖静同学_8347

2025-07-21

794人浏览

原创

Android 应用中 AdMob 广告的正确初始化姿势

本文详细阐述了在 Android 应用中正确初始化 AdMob 广告的最佳实践。核心要点是 AdMob 应且仅应在应用启动时(例如在启动屏 Activity 中)进行一次全局初始化,而非在每个 Activity 或 Fragment 中重复执行。文章还将探讨在特定场景下,若需在 Fragment 中初始化,应如何安全地使用 requireActivity() 方法。

1. AdMob 初始化原则:单次全局初始化

google mobile ads sdk(admob)的初始化是一个一次性操作,旨在为整个应用程序的生命周期准备广告服务。因此,最佳实践是在应用程序启动时仅执行一次初始化,而不是在每个 activity 或 fragment 中重复进行。重复初始化虽然通常不会导致崩溃,但会造成不必要的资源消耗和性能开销。

最佳初始化位置:

最推荐的初始化位置是在应用程序的启动 Activity 中,例如启动屏 (Splash Screen) Activity 的 onCreate() 方法,或者在自定义的 Application 类中。这样可以确保在任何广告被加载或显示之前,AdMob SDK 已经完成初始化。

示例代码:在启动 Activity 中初始化 AdMob

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;

public class SplashScreenActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen); // 假设您的启动屏有对应的布局

        // 初始化 AdMob SDK
        MobileAds.initialize(this, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
                // AdMob SDK 已成功初始化
                // 在此之后,您可以安全地加载和显示广告
                // 例如:Log.d("AdMob", "AdMob 初始化完成: " + initializationStatus.toString());

                // 可以在这里跳转到主界面,或执行其他启动逻辑
                // Intent intent = new Intent(SplashScreenActivity.this, MainActivity.class);
                // startActivity(intent);
                // finish();
            }
        });
    }
}

2. 在 Fragment 中初始化 AdMob 的考量与替代方案

尽管不推荐在每个 Fragment 中初始化 AdMob,但如果由于特定架构或遗留代码原因,您需要在 Fragment 中执行此操作(作为全局初始化的补充或备用),则需要注意上下文的获取。

getActivity() 与 requireActivity() 的选择:

在 Fragment 中,getActivity() 方法可能会返回 null,尤其是在 Fragment 尚未完全附加到 Activity 或已分离的情况下。如果在此情况下调用 MobileAds.initialize(getActivity()),将可能导致 NullPointerException。

相比之下,requireActivity() 方法则会返回非空的 Activity 实例。如果 Fragment 未附加到任何 Activity,它将抛出 IllegalStateException,这有助于在开发阶段更快地发现问题,而不是在运行时遭遇空指针异常。因此,如果必须在 Fragment 中获取 Activity 上下文进行操作,requireActivity() 是更安全的选择。

示例代码:在 Fragment 中使用 requireActivity() (不推荐作为主要初始化方式)

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import com.google.android.gms.ads.MobileAds;
import com.google.android.gms.ads.initialization.InitializationStatus;
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener;

public class MyAdFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_my_ad, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // 注意:强烈不推荐在此处进行 AdMob 的全局初始化。
        // AdMob 应该且仅应该在应用启动时初始化一次。
        // 此处仅为演示在Fragment中获取Activity上下文的正确方式。
        // 在实际应用中,如果AdMob已在应用启动时初始化,则无需在此处再次调用。

        // 确保 Fragment 已经附加到 Activity
        if (isAdded()) {
            MobileAds.initialize(requireActivity(), new OnInitializationCompleteListener() {
                @Override
                public void onInitializationComplete(InitializationStatus initializationStatus) {
                    // AdMob SDK 已初始化。
                    // 可以在此Fragment中安全地加载和显示广告。
                    // 例如:AdView adView = view.findViewById(R.id.adView); adView.loadAd(new AdRequest.Builder().build());
                }
            });
        }
    }
}

注意事项:

  • 即使在 Fragment 中使用 requireActivity(),也应避免将 AdMob 的初始化逻辑分散到多个 Fragment 中。这会导致代码冗余,并可能使初始化流程难以管理。
  • 一旦 AdMob SDK 初始化完成,后续在任何 Activity 或 Fragment 中加载和显示广告时,都不需要再次调用 MobileAds.initialize()。只需直接使用 AdView 或 InterstitialAd 等类进行广告的加载和展示即可。

3. 总结与最佳实践

为了确保 AdMob 广告服务的稳定性和效率,请遵循以下最佳实践:

  1. 单次初始化: AdMob SDK 仅需在应用程序启动时初始化一次。
  2. 选择启动点: 最佳初始化位置是应用程序的启动 Activity(如启动屏)的 onCreate() 方法。
  3. 避免重复: 避免在每个 Activity 或 Fragment 中重复调用 MobileAds.initialize()。
  4. 安全上下文: 如果确实需要在 Fragment 中执行与 Activity 上下文相关的操作,优先使用 requireActivity() 而非 getActivity(),以避免潜在的空指针异常。

遵循这些指导原则,将有助于您在 Android 应用中正确、高效地集成和管理 AdMob 广告。

相关专题

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

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

2023.09.22

509

3

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

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

2024.03.01

1638

6

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

299

31

空指针异常处理
空指针异常处理

本专题整合了空指针异常解决方法,阅读专题下面的文章了解更多详细内容。

2025.11.16

159

10

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

2023.08.14

862

4

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.22

2447

5

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

2023.09.19

4457

7

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

545

5

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

2024.03.01

904

5

热门下载

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

精品课程

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