原生广告

原生广告是通过平台原生的界面组件向用户呈现的广告素材资源。这种广告使用您在构建布局时已经采用的同类视图进行展示,而且能以和应用视觉设计相称的形式呈现。

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

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

本页介绍了如何使用 SDK 加载原生广告。 提示:如需详细了解原生广告,请参阅我们的原生广告指南

您还可以查看客户成功案例:案例研究 1案例研究 2

前提条件

始终使用测试广告进行测试

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

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

ca-app-pub-3940256099942544/2247696110

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

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

加载广告

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

构建 AdLoader

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

Java

AdLoader adLoader = new AdLoader.Builder(context, "ca-app-pub-3940256099942544/2247696110")
    .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, "ca-app-pub-3940256099942544/2247696110}")
    .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()loadAds()

loadAd()

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

Java

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

Kotlin

adLoader.loadAd(AdRequest.Builder().build())

loadAds()

此方法针对多个广告(最多 5 个)发送请求:

Java

adLoader.loadAds(new AdRequest.Builder().build(), 3);

Kotlin

adLoader.loadAds(AdRequest.Builder().build(), 3)

这两种方法都将 AdRequest 对象作为第一个参数。这同样是横幅广告和插页式广告所使用的 AdRequest 类,您可以使用 AdRequest 类的方法添加定位信息,这一点与其他广告格式一样。

加载多个广告(可选)

loadAds() 方法还有一个额外的参数:SDK 应尝试为请求加载的广告数量。此数量的上限为 5 个,并且无法保证 SDK 返回的广告数量一定等于所请求的广告数量。

返回的 Google 广告各不相同,但来自预订型广告资源或第三方买方的广告不一定是唯一的。

如果您使用中介,请勿使用 loadAds() 方法,因为涉及多个原生广告的请求目前不适用于配置为使用中介功能的广告单元 ID。

回调

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

调用 loadAds() 后,系统会进行多次此类回调(至少一次,但不超过请求的广告数量)。对于请求多个广告的应用,应在其回调实现代码中调用 AdLoader.isLoading(),以确定是否已完成加载过程。

下例展示了如何在 onNativeAdLoaded() 回调中检查 isLoading()

Java

final AdLoader adLoader = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
        .forNativeAd(new NativeAd.OnNativeAdLoadedListener() {
    @Override
    public void onNativeAdLoaded(NativeAd nativeAd) {
        ...
        // some code that displays the ad.
        ...
        if (adLoader.isLoading()) {
            // The AdLoader is still loading ads.
            // Expect more adLoaded or onAdFailedToLoad callbacks.
        } else {
            // The AdLoader has finished loading ads.
        }
    }
}).build();
adLoader.loadAds(new AdRequest.Builder().build(), 3);

Kotlin

lateinit var adLoader: AdLoader
...
adLoader = AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
    .forNativeAd {
        ...
        // some code that displays the ad.
        ...
        if (adLoader.isLoading) {
            // The AdLoader is still loading ads.
            // Expect more adLoaded or onAdFailedToLoad callbacks.
        } else {
            // The AdLoader has finished loading ads.
        }
    }.build()
adLoader.loadAds(AdRequest.Builder().build(), 3)

释放资源

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

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

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

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

Java

final AdLoader adLoader = new AdLoader.Builder(this, "ca-app-pub-3940256099942544/2247696110")
        .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, "ca-app-pub-3940256099942544/2247696110")
    .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()loadAds()

  • 将原生广告缓存限制为仅在需要时缓存的内容。例如,在预缓存时,请仅缓存立即显示在屏幕上的广告。原生广告占用大量内存,如果缓存原生广告而不销毁它们,就会导致内存用量过多。

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

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

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

硬件加速默认处于启用状态,但有些应用可能会选择将其停用。如果您的应用属于这种情况,我们建议您为使用广告的 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 本身启用硬件加速。

展示您的广告

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