插页式广告属于全屏广告,会覆盖宿主应用的整个界面,通常展示在应用流程的自然过渡点上,例如,活动之间的切换处或游戏关卡之间的暂停时段中。当应用展示插页式广告时,用户既可以选择点按该广告,进而访问其目标网址,也可以将其关闭,并返回应用。案例研究。
本指南介绍了如何将插页式广告植入到 Android 应用中。
前提条件
- 导入 Google 移动广告 SDK(可以只导入其自身,也可以将其作为 Firebase 的一部分加以导入)。
创建插页式广告对象
插页式广告是通过 InterstitialAd
对象加以请求和展示的。所以,第一步是将 InterstitialAd
实例化,并设置其广告单元 ID,这可在 Activity 的 onCreate()
方法中完成:
Java
package ... import com.google.android.gms.ads.InterstitialAd; public class MainActivity extends Activity { private InterstitialAd mInterstitialAd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MobileAds.initialize(this, new OnInitializationCompleteListener() { @Override public void onInitializationComplete(InitializationStatus initializationStatus) {} }); mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712"); } }
Kotlin
class MainActivity : Activity() { private lateinit var mInterstitialAd: InterstitialAd override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) MobileAds.initialize(this) {} mInterstitialAd = InterstitialAd(this) mInterstitialAd.adUnitId = "ca-app-pub-3940256099942544/1033173712" } }
在 Activity 的整个生命周期内,只需使用一个 InterstitialAd
对象,即可请求并展示多个插页式广告,因此该对象只需构建一次。
务必用测试广告进行测试
在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。否则,可能会导致您的帐号被暂停。
对于 Android 插页式广告,加载测试广告最简便的方法就是使用下面的专用测试广告单元 ID:
ca-app-pub-3940256099942544/1033173712
该测试广告单元 ID 已经过专门配置,可为每个请求返回测试广告,您可以在自己应用的编码、测试和调试过程中随意使用该测试广告单元 ID。只是一定要在发布应用前用您自己的广告单元 ID 替换该测试广告单元 ID。
如需详细了解移动广告 SDK 的测试广告如何运作,请参阅测试广告。
加载广告
若要加载插页式广告,请调用 InterstitialAd
对象的 loadAd()
方法。此方法会接受 AdRequest
对象,将其作为自己的单个参数:
Java
package ... import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.InterstitialAd; public class MainActivity extends Activity { private InterstitialAd mInterstitialAd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713"); mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712"); mInterstitialAd.loadAd(new AdRequest.Builder().build()); } }
Kotlin
class MainActivity : Activity() { private lateinit var mInterstitialAd: InterstitialAd override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713") mInterstitialAd = InterstitialAd(this) mInterstitialAd.adUnitId = "ca-app-pub-3940256099942544/1033173712" mInterstitialAd.loadAd(AdRequest.Builder().build()) } }
展示广告
插页式广告应在应用流程的自然停顿期间进行展示,例如游戏的不同关卡之间或用户完成一项任务之后,都是非常不错的展示时机。要展示插页式广告,请使用 isLoaded()
方法验证广告是否已完成加载,然后调用 show()
。上一个代码示例中的插页式广告可以在按钮的 OnClickListener
中展示,如下所示:
Java
mMyButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (mInterstitialAd.isLoaded()) { mInterstitialAd.show(); } else { Log.d("TAG", "The interstitial wasn't loaded yet."); } } });
Kotlin
mMyButton.setOnClickListener { if (mInterstitialAd.isLoaded) { mInterstitialAd.show() } else { Log.d("TAG", "The interstitial wasn't loaded yet.") } }
广告事件
要进一步自定义您的广告行为,您可以在广告生命周期内加入许多事件,如加载、打开、关闭等等。您可以通过 AdListener
类监听这些事件。
若要将 AdListener
用于 InterstitialAd
对象,只需调用 setAdListener()
方法即可:
Java
mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdLoaded() { // Code to be executed when an ad finishes loading. } @Override public void onAdFailedToLoad(LoadAdError adError) { // Code to be executed when an ad request fails. } @Override public void onAdOpened() { // Code to be executed when the ad is displayed. } @Override public void onAdClicked() { // Code to be executed when the user clicks on an ad. } @Override public void onAdLeftApplication() { // Code to be executed when the user has left the app. } @Override public void onAdClosed() { // Code to be executed when the interstitial ad is closed. } });
Kotlin
mInterstitialAd.adListener = object: AdListener() { override fun onAdLoaded() { // Code to be executed when an ad finishes loading. } override fun onAdFailedToLoad(adError: LoadAdError) { // Code to be executed when an ad request fails. } override fun onAdOpened() { // Code to be executed when the ad is displayed. } override fun onAdClicked() { // Code to be executed when the user clicks on an ad. } override fun onAdLeftApplication() { // Code to be executed when the user has left the app. } override fun onAdClosed() { // Code to be executed when the interstitial ad is closed. } }
AdListener
中每种可替换的方法均对应广告生命周期内的一个事件。
可替换的方法 | |
---|---|
onAdLoaded()
|
广告加载完成后,系统会执行 onAdLoaded() 方法。
|
onAdFailedToLoad()
|
onAdFailedToLoad() 是唯一包含参数的方法。LoadAdError 类型的错误参数描述了发生的错误。如需了解详情,请参阅“调试广告加载错误”文档。
|
onAdOpened()
|
在广告开始展示并铺满设备屏幕时,系统会调用此方法。 |
onAdLeftApplication()
|
在用户点击打开其他应用(如 Google Play)时,系统会调用此方法,从而在后台运行当前应用。 |
onAdClosed()
|
此方法会在用户点按“关闭”按钮关闭插页式广告时被调用。如果您的应用暂停了音频输出或游戏循环,则非常适合使用此方法恢复这些活动。 |
使用 AdListener 重新加载
在上一个插页式广告展示完毕后,您可以非常方便地使用 AdListener
类的 onAdClosed()
方法加载新的插页式广告:
Java
... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713"); mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712"); mInterstitialAd.loadAd(new AdRequest.Builder().build()); mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdClosed() { // Load the next interstitial. mInterstitialAd.loadAd(new AdRequest.Builder().build()); } }); } ...
Kotlin
... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) MobileAds.initialize(this, "ca-app-pub-3940256099942544~3347511713") mInterstitialAd = InterstitialAd(this) mInterstitialAd.adUnitId = "ca-app-pub-3940256099942544/1033173712" mInterstitialAd.adListener = object : AdListener() { override fun onAdClosed() { mInterstitialAd.loadAd(AdRequest.Builder().build()) } } } ...
一些最佳做法
- 考虑插页式广告这种广告类型是否适合您的应用。
- 在具有自然过渡点的应用中,插页式广告的效果最好。此类过渡点通常存在于应用内的任务结束时,例如分享完图片或完成一个游戏关卡时。因为用户希望借此机会在操作过程中休息一下,所以,此时展示插页式广告不会影响用户体验。请务必考虑在应用流程的哪些时间点展示插页式广告,以及用户可能会以什么方式响应。
- 务必在展示插页式广告时暂停操作。
- 插页式广告类型多样,包括文字广告、图片广告和视频广告等。确保应用在展示插页式广告时,也会暂停使用某些资源,以便供广告使用,这一点十分重要。例如,当您调用展示插页式广告时,请务必暂停应用生成的所有音频输出。您可以在
onAdClosed()
事件处理脚本中恢复声音播放,当在用户结束与广告的互动时,就会调用这个处理脚本。此外,请考虑在展示广告时暂停所有密集计算任务,例如游戏循环。这将确保用户不会遇到图像无响应、响应慢或视频卡顿的现象。 - 留出充足的加载时间。
- 确保在恰当的时间展示插页式广告十分重要,同样,确保用户无需等待广告加载也十分重要。在您打算调用
show()
前,请事先通过调用loadAd()
加载广告,这可确保应用在广告展示时间到来前完全加载插页式广告。 - 不要向用户展示太多广告。
- 虽然提高插页式广告在应用中的展示频次似乎是实现增收的好方法,但这么做会影响用户体验,还会降低点击率。应确保用户不会频繁受到广告打扰,使他们可以充分享受到使用应用的乐趣。