原生广告是通过平台原生的界面组件向用户呈现的广告素材资源。它们在展示时使用的视图类型与您已用来构建布局的类型相同,而且能以和应用的视觉设计相称的形式呈现。
加载原生广告时,您的应用会收到一个包含其素材资源的广告对象,然后由应用(而不是 Google 移动广告 SDK)负责展示广告。
一般而言,成功植入原生广告涉及到以下两个部分:使用 SDK 加载广告,然后在您的应用中展示广告内容。
本页介绍了如何使用 SDK 加载 原生广告。
前提条件
- 通读入门指南。
务必用测试广告进行测试
在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。
对于 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 by logging, altering the UI, and so on.
}
})
.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 本身启用硬件加速。
展示广告
加载广告后,您只需向用户展示广告即可。请参阅我们的原生高级广告指南,了解具体方法。