原生广告

原生广告是通过平台原本就有的界面组件向用户呈现的广告素材资源。它们使用您在构建布局时已经采用的相同类型的视图来展示,并且能以与应用的视觉设计相称的格式呈现。

加载原生广告时,您的应用会收到一个包含其素材资源的广告对象,然后由应用(而不是 Google 移动广告 SDK)负责展示它们。

一般而言,要成功植入原生广告,就需要完成以下两步:使用 SDK 加载广告,然后在您的应用中展示广告内容。

本页介绍了如何使用 SDK 加载原生广告

前提条件

务必用测试广告进行测试

在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。

对于 Android 原生广告,加载测试广告最简便的方法就是使用下面的测试专用广告单元 ID:

/21775744923/example/native

该测试广告单元 ID 已经过专门配置,可确保每个请求返回的都是测试广告。您可以在自己应用的编码、测试和调试过程中使用该测试广告单元 ID。只需确保您会在发布应用前用自己的广告单元 ID 替换该测试广告单元 ID 即可。

如需详细了解 Google 移动广告 SDK 的测试广告如何运作,请参阅测试广告

加载广告

原生广告使用 AdLoader 类加载,该类有自己的 Builder 类,可在广告制作过程中对广告进行自定义。应用在构建 AdLoader 的过程中会向其添加监听器,以指定它准备接收哪些类型的原生广告。这样,AdLoader 就会只请求这些类型的广告。

构建 AdLoader

以下代码演示了如何构建可加载原生广告的 AdLoader

Java

AdLoader adLoader = new AdLoader.Builder(context, "/21775744923/example/native")
    .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
        @Override
        public void onNativeAdLoaded(NativeAd nativeAd) {
            // Show the ad.
        }
    })
    .withAdListener(new AdListener() {
        @Override
        public void onAdFailedToLoad(LoadAdError adError) {
            // Handle the failure by logging, altering the UI, and so on.
        }
    })
    .withNativeAdOptions(new NativeAdOptions.Builder()
            // Methods in the NativeAdOptions.Builder class can be
            // used here to specify individual options settings.
            .build())
    .build();

Kotlin

val adLoader = AdLoader.Builder(this, "/21775744923/example/native}")
    .forNativeAd { ad : NativeAd ->
        // Show the ad.
    }
    .withAdListener(object : AdListener() {
        override fun onAdFailedToLoad(adError: LoadAdError) {
            // Handle the failure.
        }
    })
    .withNativeAdOptions(NativeAdOptions.Builder()
            // Methods in the NativeAdOptions.Builder class can be
            // used here to specify individual options settings.
            .build())
    .build()

forNativeAd() 方法负责为 NativeAd 格式准备 AdLoader。当广告成功加载后,会调用监听器对象的 onNativeAdLoaded() 方法。

使用 AdLoader 设置 AdListener(可选)

创建 AdLoader 时,withAdListener 函数会为加载器设置 AdListener。该方法将 AdListener 作为其唯一参数,当广告生命周期事件发生时,该参数会收到来自 AdLoader 的回调:

Java

.withAdListener(new AdListener() {
    // AdListener callbacks can be overridden here.
})

Kotlin

.withAdListener(object : AdListener() {
    // AdListener callbacks can be overridden here.
})

提出广告请求

构建完 AdLoader 后,就可以使用它来请求广告了。 使用 loadAd() 方法,该方法将 AdManagerAdRequest 对象作为第一个参数。这也是横幅广告和插页式广告使用的 AdManagerAdRequest 类,您可以使用 AdManagerAdRequest 类的方法添加定位信息,就像处理其他广告格式一样。

loadAd()

此方法针对单个广告发送请求。

Java

adLoader.loadAd(new AdManagerAdRequest.Builder().build());

Kotlin

adLoader.loadAd(AdManagerAdRequest.Builder().build())

回调

调用 loadAd() 后,系统会对之前定义的监听器方法进行一次回调,以投放原生广告对象或报告错误。

释放资源

请务必对已加载的原生广告使用 destroy() 方法。这样可以释放利用的资源并防止内存泄漏。

确保在 activity 的 onDestroy() 方法中销毁所有 NativeAd 引用。

onNativeAdLoaded 回调中,请务必销毁将要解引用的所有现有原生广告。

另一项关键检查是 activity 是否已销毁,如果是,则对返回的广告调用 destroy() 并立即返回:

Java

final AdLoader adLoader = new AdLoader.Builder(this, "/21775744923/example/native")
        .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
    @Override
    public void onNativeAdLoaded(NativeAd nativeAd) {
        // If this callback occurs after the activity is destroyed, you
        // must call destroy and return or you may get a memory leak.
        // Note `isDestroyed()` is a method on Activity.
        if (isDestroyed()) {
            nativeAd.destroy();
            return;
        }
        ...
    }
}).build();

Kotlin

lateinit var adLoader: AdLoader
...
adLoader = AdLoader.Builder(this, "/21775744923/example/native")
    .forNativeAd { nativeAd ->
        // If this callback occurs after the activity is destroyed, you
        // must call destroy and return or you may get a memory leak.
        // Note `isDestroyed` is a method on Activity.
        if (isDestroyed) {
            nativeAd.destroy()
            return@forNativeAd
        }
        ...
    }.build()

最佳做法

加载广告时,请遵循以下规则。

  • 在列表中使用原生广告的应用应预缓存广告列表。

  • 预缓存广告时,请清除缓存,并在一小时后重新加载。

  • 在第一个请求完成加载之前,不要对 AdLoader 调用 loadAd()

  • 仅缓存所需的原生广告。例如,在预缓存时,仅缓存直接在屏幕上可见的广告。原生广告占用大量内存,如果缓存原生广告而不销毁它们,就会导致内存用量过多。

  • 销毁不再使用的原生广告。

针对视频广告启用硬件加速

为了确保视频广告在原生广告视图中成功展示,必须启用硬件加速

硬件加速默认处于启用状态,但有些应用可能会选择将其停用。如果您的应用停用了硬件加速,我们建议您为使用广告的 activity 类启用硬件加速。

启用硬件加速

如果您的应用在全局级别启用硬件加速时无法正常运行,您也可以针对个别 activity 启用或停用硬件加速。如需启用或停用硬件加速,请对 AndroidManifest.xml 中的 <application><activity> 元素使用 android:hardwareAccelerated 属性。以下示例展示了如何为整个应用启用硬件加速,但为一个 activity 停用硬件加速:

<application android:hardwareAccelerated="true">
    <!-- For activities that use ads, hardwareAcceleration should be true. -->
    <activity android:hardwareAccelerated="true" />
    <!-- For activities that don't use ads, hardwareAcceleration can be false. -->
    <activity android:hardwareAccelerated="false" />
</application>

如需详细了解用于控制硬件加速的选项,请参阅硬件加速指南。请注意,如果针对 activity 停用了硬件加速,那么将无法针对单个广告视图启用,因此必须针对 activity 本身启用硬件加速。

展示您的广告

加载广告后,剩下的工作就是将其展示给您的用户。请参阅我们的原生高级广告指南,了解具体方法。