Interstitial Ads

插页式广告属于全屏广告,会覆盖宿主应用的整个界面,通常展示在应用流程的自然过渡点上,例如,活动之间的切换处或游戏关卡之间的暂停时段中。当应用展示插页式广告时,用户既可以选择点按该广告,进而访问其目标网址,也可以将其关闭,并返回应用。

本指南介绍了如何将插页式广告植入到 Android 应用中。

前提条件

创建插页式广告对象

插页式广告是通过 PublisherInterstitialAd 对象加以请求和展示的。所以,第一步是将 PublisherInterstitialAd 实例化,并设置其广告单元 ID,这可在 Activity 的 onCreate() 方法中完成:

Java

    package ...

    import com.google.android.gms.ads.doubleclick.PublisherInterstitialAd;

    public class MainActivity extends Activity {

        private PublisherInterstitialAd mPublisherInterstitialAd;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mPublisherInterstitialAd = new PublisherInterstitialAd(this);
            mPublisherInterstitialAd.setAdUnitId("/6499/example/interstitial");
        }
    }

Kotlin

    class MainActivity : Activity() {

        private lateinit var mPublisherInterstitialAd: PublisherInterstitialAd

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            mPublisherInterstitialAd = PublisherInterstitialAd(this)
            mPublisherInterstitialAd.adUnitId = "/6499/example/interstitial"
        }
    }

在 Activity 的整个生命周期内,只需使用一个 PublisherInterstitialAd 对象,即可请求并展示多个插页式广告,因此该对象只需构建一次。

务必用测试广告进行测试

在构建和测试应用时,请确保使用的是测试广告,而不是实际投放的广告。否则,可能会导致您的帐号被暂停。

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

/6499/example/interstitial

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

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

加载广告

要加载插页式广告,请调用 PublisherInterstitialAd 对象的 loadAd() 方法。此方法会接受 PublisherAdRequest 对象,将其作为自己的单个参数:

Java

    package ...

    import com.google.android.gms.ads.doubleclick.PublisherAdRequest;
    import com.google.android.gms.ads.doubleclick.PublisherInterstitialAd;

    public class MainActivity extends Activity {

        private PublisherInterstitialAd mPublisherInterstitialAd;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mPublisherInterstitialAd = new PublisherInterstitialAd(this);
            mPublisherInterstitialAd.setAdUnitId("/6499/example/interstitial");
            mPublisherInterstitialAd.loadAd(new PublisherAdRequest.Builder().build());
        }
    }

Kotlin

    class MainActivity : Activity() {

        private lateinit var mPublisherInterstitialAd: PublisherInterstitialAd

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            mPublisherInterstitialAd = PublisherInterstitialAd(this)
            mPublisherInterstitialAd.adUnitId = "/6499/example/interstitial"
            mPublisherInterstitialAd.loadAd(PublisherAdRequest.Builder().build())
        }
    }

展示广告

插页式广告应在应用流程的自然停顿期间进行展示,例如游戏的不同关卡之间或用户完成一项任务之后,都是非常不错的展示时机。要展示插页式广告,请使用 isLoaded() 方法验证广告是否已完成加载,然后调用 show()。上一个代码示例中的插页式广告可以在按钮的 OnClickListener 中展示,如下所示:

Java

    mMyButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mPublisherInterstitialAd.isLoaded()) {
                mPublisherInterstitialAd.show();
            } else {
                Log.d("TAG", "The interstitial wasn't loaded yet.");
            }
        }
    });

Kotlin

    mMyButton.setOnClickListener {
        if (mPublisherInterstitialAd.isLoaded) {
            mPublisherInterstitialAd.show()
        } else {
            Log.d("TAG", "The interstitial wasn't loaded yet.")
        }
    }
    

广告事件

要进一步自定义您的广告行为,您可以在广告生命周期内加入许多事件,如加载、打开、关闭等等。您可以通过 AdListener 类监听这些事件。

要将 AdListener 用于 PublisherInterstitialAd 对象,只需调用 setAdListener() 方法即可:

Java

    mPublisherInterstitialAd.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            // Code to be executed when an ad finishes loading.
        }

        @Override
        public void onAdFailedToLoad(int errorCode) {
            // 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

    mPublisherInterstitialAd.adListener = object: AdListener() {
        override fun onAdLoaded() {
            // Code to be executed when an ad finishes loading.
        }

        override fun onAdFailedToLoad(errorCode: Int) {
            // 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() 方法包含一个 errorCode 参数,该参数会指明发生了何种类型的失败。系统将这些可能的类型值定义为 PublisherAdRequest 类中的如下常量:
  • ERROR_CODE_INTERNAL_ERROR - 内部出现问题;例如,收到广告服务器的无效响应。
  • ERROR_CODE_INVALID_REQUEST - 广告请求无效;例如,广告单元 ID 不正确。
  • ERROR_CODE_NETWORK_ERROR - 由于网络连接问题,广告请求失败。
  • ERROR_CODE_NO_FILL - 广告请求成功,但由于缺少广告资源,未返回广告。
onAdOpened() 在广告开始展示并铺满设备屏幕时,系统会调用此方法。
onAdLeftApplication() 在用户点击打开其他应用(如 Google Play)时,系统会调用此方法,从而在后台运行当前应用。
onAdClosed() 在用户点按“关闭”图标或使用“返回”按钮关闭插页式广告时,系统会调用此方法。如果您的应用暂停了音频输出或游戏循环,则非常适合使用此方法恢复这些活动。

使用 AdListener 重新加载

在上一个插页式广告展示完毕后,您可以非常方便地使用 AdListener 类的 onAdClosed() 方法加载新的插页式广告:

Java

    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        mPublisherInterstitialAd = new PublisherInterstitialAd(this);
        mPublisherInterstitialAd.setAdUnitId("/6499/example/interstitial");
        mPublisherInterstitialAd.loadAd(new PublisherAdRequest.Builder().build());

        mPublisherInterstitialAd.setAdListener(new AdListener() {
            @Override
            public void onAdClosed() {
                // Load the next interstitial.
                mPublisherInterstitialAd.loadAd(new PublisherAdRequest.Builder().build());
            }

        });
    }
    ...
    

Kotlin

    ...
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    
        mPublisherInterstitialAd = InterstitialAd(this)
        mPublisherInterstitialAd.adUnitId = "/6499/example/interstitial"
        mPublisherInterstitialAd.adListener = object : AdListener() {
            override fun onAdClosed() {
                mPublisherInterstitialAd.loadAd(PublisherAdRequest.Builder().build())
            }
        }
    }
    ...
    

一些最佳做法

考虑插页式广告这种广告类型是否适合您的应用。
在具有自然过渡点的应用中,插页式广告的效果最好。此类过渡点通常存在于应用内的任务结束时,例如分享完图片或完成一个游戏关卡时。因为用户希望借此机会在操作过程中休息一下,所以,此时展示插页式广告不会影响用户体验。请务必考虑在应用流程的哪些时间点展示插页式广告,以及用户可能会以什么方式响应。
务必在展示插页式广告时暂停操作。
插页式广告类型多样,包括文字广告、图片广告和视频广告等。确保应用在展示插页式广告时,也会暂停使用某些资源,以便供广告使用,这一点十分重要。例如,当您请求展示插页式广告时,请务必暂停应用产生的所有音频输出。您可以在 onAdClosed() 事件处理脚本中恢复声音播放,当用户结束与广告的互动时,就会调用这个处理脚本。此外,还应考虑在广告展示时暂停所有会占用大量资源的计算任务,例如游戏循环。这样可以确保用户不会遇到图像无响应、响应慢或视频卡顿的现象。
留出充足的加载时间。
确保在恰当的时间展示插页式广告十分重要,同样,确保用户无需等待广告加载也十分重要。在您打算调用 show() 前,不妨调用 loadAd() 事先加载广告,这样可确保应用在广告展示时间到来时,已准备好加载完毕的插页式广告。
不要向用户展示太多广告。
虽然提高插页式广告在应用中的展示频次似乎是实现增收的好方法,但这么做会影响用户体验,还会降低点击率。应确保用户不会频繁受到广告打扰,使他们可以充分享受到使用应用的乐趣。

Additional resources

Samples on GitHub

Mobile Ads Garage video tutorials

Next steps