
MobileAds.initialize() 方法用于初始化Google AdMob SDK。这是一项全局性的设置操作,旨在为整个应用程序配置AdMob服务,而非针对某个特定的UI组件(如Activity或Fragment)。因此,其核心原则是:整个应用程序生命周期中,AdMob SDK 只需初始化一次。
重复调用 MobileAds.initialize() 不仅是多余的,还会造成不必要的资源消耗,可能导致性能下降,甚至在某些情况下引发不可预测的行为。一旦SDK被初始化,它就会在后台管理广告请求和加载,无需在每次需要展示广告时重新初始化。
为了确保AdMob SDK在应用启动时尽早且仅初始化一次,以下是两种推荐的最佳实践:
将AdMob初始化逻辑放入自定义的 Application 类的 onCreate() 方法中,是业界公认的最佳实践。Application 类在应用程序进程创建时被实例化,且其 onCreate() 方法只会被调用一次,这完美符合AdMob SDK的单次初始化需求。
步骤:
创建自定义 Application 类:
import android.app.Application;
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 MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化 AdMob SDK
        MobileAds.initialize(this, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
                // AdMob SDK 初始化完成的回调
                // 可以在这里记录日志或执行其他初始化后的操作
                // 例如:Log.d("AdMob", "AdMob SDK initialized successfully.");
            }
        });
    }
}在 AndroidManifest.xml 中声明: 在 <application> 标签中添加 android:name=".MyApplication" (如果你的类名是 MyApplication)。
<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/Theme.YourApp">
    <!-- 其他 Activity、Service 等声明 -->
</application>如果你的应用包含一个启动屏(Splash Screen)Activity,也可以在该Activity的 onCreate() 方法中进行AdMob初始化。这种方式也能确保在应用核心功能加载前完成初始化。
import android.content.Intent;
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); // 你的启动屏布局
        MobileAds.initialize(this, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
                // 初始化完成后,可以跳转到主界面
                startActivity(new Intent(SplashScreenActivity.this, MainActivity.class));
                finish(); // 关闭启动屏
            }
        });
    }
}这种方法的缺点是,如果用户快速退出启动屏,或者启动屏逻辑复杂,可能会导致初始化未完成。因此,Application 类是更稳健的选择。
虽然不推荐,但在某些特定场景下,开发者可能会考虑在Fragment中进行AdMob初始化。如果确实需要在Fragment中进行,务必注意以下几点:
避免重复初始化: 即使在Fragment中,也必须确保 MobileAds.initialize() 仅被调用一次。Fragment的生命周期复杂,容易导致重复调用。可以引入一个全局的布尔标志(例如,在 Application 类中定义)来跟踪AdMob是否已初始化。
上下文选择:requireActivity() vs getActivity() 在Fragment中获取 Context 对象时,getActivity() 方法可能会返回 null,尤其是在Fragment的生命周期末期(例如,Fragment已与Activity分离但仍有异步任务在执行)。这可能导致 NullPointerException。
相比之下,requireActivity() 方法在Fragment未附加到Activity时会抛出 IllegalStateException,这使得问题更早地暴露出来,并强制开发者处理这种状态。因此,在需要一个非空 Activity 上下文时,requireActivity() 是更安全的选择。
示例代码 (不推荐的Fragment初始化方式,仅为说明上下文使用):
import android.os.Bundle;
import android.util.Log;
import android.view.View;
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 {
    // 建议在Application类中维护一个全局的初始化状态,而不是在Fragment内部
    // private static boolean isAdMobGloballyInitialized = false;
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        // 强烈不建议在此处初始化,但如果必须,请确保只执行一次
        // 更好的做法是检查一个全局标志,例如:
        // if (!MyApplication.isAdMobGloballyInitialized()) {
        //     MobileAds.initialize(requireActivity(), new OnInitializationCompleteListener() {
        //         @Override
        //         public void onInitializationComplete(InitializationStatus initializationStatus) {
        //             Log.d("AdMob", "AdMob initialized in Fragment (using requireActivity()).");
        //             MyApplication.setAdMobGloballyInitialized(true);
        //         }
        //     });
        // }
        // 原始问题中的代码,并使用requireActivity()改进
        // 再次强调,不建议在Fragment的onViewCreated中直接初始化,除非有严格的单次调用控制
        MobileAds.initialize(requireActivity(), new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
                Log.d("AdMob", "AdMob initialized in Fragment (using requireActivity()). This should ideally happen only once per app lifecycle.");
            }
        });
    }
}注意: 上述Fragment中的初始化代码仅作示例,实际应用中,如果将初始化逻辑放在Fragment的 onViewCreated 中,并且该Fragment可能被多次创建或销毁,或者有多个包含此代码的Fragment,那么 MobileAds.initialize() 将会被重复调用。这违背了AdMob SDK的单次初始化原则。因此,强烈建议通过 Application 类进行全局初始化。
遵循这些最佳实践,可以确保AdMob SDK在Android应用中高效、稳定地运行。
以上就是Android AdMob SDK 初始化策略:优化性能与避免重复操作的详细内容,更多请关注php中文网其它相关文章!
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号