โฆษณาเปิดแอป

เลือกแพลตฟอร์ม: Android iOS Unity Flutter Android (เดิม)

คู่มือนี้มีไว้สำหรับผู้เผยแพร่โฆษณาที่ผสานรวมโฆษณาเปิดแอปโดยใช้ Google Mobile Ads SDK (Legacy)

โฆษณาเปิดแอปเป็นรูปแบบโฆษณาพิเศษที่ออกแบบมาสำหรับผู้เผยแพร่โฆษณาที่ต้องการสร้างรายได้จากหน้าจอโหลดของแอป โฆษณาเปิดแอปสามารถปิดได้ทุกเมื่อ และออกแบบมาให้แสดงเมื่อผู้ใช้นำแอปของคุณมาไว้ที่เบื้องหน้า

โฆษณาเปิดแอปจะแสดงองค์ประกอบแบรนด์ขนาดเล็กๆ โดยอัตโนมัติเพื่อให้ผู้ใช้รู้ว่ากำลังอยู่ในแอปของคุณ ตัวอย่างโฆษณาเปิดแอปมีลักษณะดังนี้

ข้อกำหนดเบื้องต้น

ทดสอบด้วยโฆษณาทดสอบเสมอ

เมื่อสร้างและทดสอบแอป โปรดใช้โฆษณาทดสอบแทนโฆษณาจริงที่ใช้งานจริง หากไม่ดำเนินการดังกล่าว อาจส่งผลให้บัญชีถูกระงับ

วิธีที่ง่ายที่สุดในการโหลดโฆษณาทดสอบคือการใช้รหัสหน่วยโฆษณาทดสอบเฉพาะสำหรับโฆษณาเปิดแอป ดังนี้

ca-app-pub-3940256099942544/9257395921

ซึ่งได้รับการกำหนดค่าเป็นพิเศษให้แสดงโฆษณาทดสอบสำหรับทุกคำขอ และคุณสามารถใช้ในแอปของคุณเองได้อย่างอิสระขณะเขียนโค้ด ทดสอบ และแก้ไขข้อบกพร่อง เพียงตรวจสอบว่าคุณได้แทนที่ด้วยรหัสหน่วยโฆษณาของคุณเองก่อนที่จะเผยแพร่แอป

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานของโฆษณาทดสอบของ Google Mobile Ads SDK (Legacy) ได้ที่เปิดใช้โฆษณาทดสอบ

ขยายคลาส Application

สร้างคลาสใหม่ที่ขยายคลาส Application วิธีนี้ช่วยให้จัดการโฆษณาที่เชื่อมโยงกับสถานะของแอปพลิเคชันได้โดยคำนึงถึงวงจรชีวิต แทนที่จะเป็น Activity เดียว

Java

public class MyApplication extends Application
    implements ActivityLifecycleCallbacks, DefaultLifecycleObserver {

  private AppOpenAdManager appOpenAdManager;
  private Activity currentActivity;

  @Override
  public void onCreate() {
    super.onCreate();
    this.registerActivityLifecycleCallbacks(this);

    ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
    appOpenAdManager = new AppOpenAdManager();
  }

Kotlin

class MyApplication :
  Application(), Application.ActivityLifecycleCallbacks, DefaultLifecycleObserver {

  private lateinit var appOpenAdManager: AppOpenAdManager
  private var currentActivity: Activity? = null

  override fun onCreate() {
    super<Application>.onCreate()
    registerActivityLifecycleCallbacks(this)

    ProcessLifecycleOwner.get().lifecycle.addObserver(this)
    appOpenAdManager = AppOpenAdManager()
  }

ถัดไป ให้เพิ่มโค้ดต่อไปนี้ลงใน AndroidManifest.xml

<!-- TODO: Update to reference your actual package name. -->
<application
    android:name="com.google.android.gms.example.appopendemo.MyApplication" ...>
...
</application>

ใช้คอมโพเนนต์ยูทิลิตี

โฆษณาควรแสดงอย่างรวดเร็ว ดังนั้นจึงควรโหลดโฆษณาก่อนที่จะต้องแสดง วิธีนี้จะช่วยให้คุณมีโฆษณาที่พร้อมแสดงทันทีที่ผู้ใช้เข้าสู่แอป

ใช้คอมโพเนนต์ยูทิลิตี AppOpenAdManager เพื่อรวมงานที่เกี่ยวข้องกับการโหลดและการแสดงโฆษณาเปิดแอปเข้าด้วยกัน

Java

private class AppOpenAdManager {

  private static final String LOG_TAG = "AppOpenAdManager";
  private static final String AD_UNIT_ID = "ca-app-pub-3940256099942544/9257395921";

  private AppOpenAd appOpenAd = null;
  private boolean isLoadingAd = false;
  private boolean isShowingAd = false;

  /** Keep track of the time an app open ad is loaded to ensure you don't show an expired ad. */
  private long loadTime = 0;

  /** Constructor. */
  public AppOpenAdManager() {}

Kotlin

private inner class AppOpenAdManager {

  private var appOpenAd: AppOpenAd? = null
  private var isLoadingAd = false
  var isShowingAd = false

  /** Keep track of the time an app open ad is loaded to ensure you don't show an expired ad. */
  private var loadTime: Long = 0

หากต้องการใช้ AppOpenAdManager ให้เรียกใช้เมธอด Wrapper สาธารณะในอินสแตนซ์ MyApplication แบบ Singleton คลาส Application จะเชื่อมต่อกับโค้ดส่วนที่เหลือ โดยมอบสิทธิ์การโหลดและแสดงโฆษณาให้แก่ผู้จัดการ

โหลดโฆษณา

ขั้นตอนถัดไปคือการกรอกเมธอด loadAd และจัดการ Callback การโหลดโฆษณา

Java

AppOpenAd.load(
    context,
    "AD_UNIT_ID",
    new AdRequest.Builder().build(),
    new AppOpenAdLoadCallback() {
      @Override
      public void onAdLoaded(AppOpenAd ad) {
        // Called when an app open ad has loaded.
        Log.d(LOG_TAG, "App open ad loaded.");

        appOpenAd = ad;
        isLoadingAd = false;
        loadTime = (new Date()).getTime();
      }

      @Override
      public void onAdFailedToLoad(LoadAdError loadAdError) {
        // Called when an app open ad has failed to load.
        Log.d(LOG_TAG, "App open ad failed to load with error: " + loadAdError.getMessage());

        isLoadingAd = false;
      }
    });

Kotlin

AppOpenAd.load(
  context,
  "AD_UNIT_ID",
  AdRequest.Builder().build(),
  object : AppOpenAdLoadCallback() {
    override fun onAdLoaded(ad: AppOpenAd) {
      // Called when an app open ad has loaded.
      Log.d(LOG_TAG, "App open ad loaded.")

      appOpenAd = ad
      isLoadingAd = false
      loadTime = Date().time
    }

    override fun onAdFailedToLoad(loadAdError: LoadAdError) {
      // Called when an app open ad has failed to load.
      Log.d(LOG_TAG, "App open ad failed to load with error: " + loadAdError.message)

      isLoadingAd = false
    }
  },
)

แทนที่ AD_UNIT_ID ด้วยรหัสหน่วยโฆษณาของคุณเอง

แสดงโฆษณา

การใช้งานโฆษณาเปิดแอปที่พบบ่อยที่สุดคือการพยายามแสดงโฆษณาเปิดแอปเมื่อเปิดแอป เริ่มเนื้อหาแอปหากโฆษณาไม่พร้อม และโหลดโฆษณาอื่นล่วงหน้าสำหรับโอกาสในการเปิดแอปครั้งถัดไป ดูตัวอย่างการใช้งานได้ในหลักเกณฑ์โฆษณาเปิดแอป

โค้ดต่อไปนี้จะแสดงและโหลดโฆษณาซ้ำในภายหลัง

Java

public void showAdIfAvailable(
    @NonNull final Activity activity,
    @NonNull OnShowAdCompleteListener onShowAdCompleteListener) {
  // If the app open ad is already showing, do not show the ad again.
  if (isShowingAd) {
    Log.d(TAG, "The app open ad is already showing.");
    return;
  }

  // If the app open ad is not available yet, invoke the callback then load the ad.
  if (appOpenAd == null) {
    Log.d(TAG, "The app open ad is not ready yet.");
    onShowAdCompleteListener.onShowAdComplete();
    // Load an ad.
    return;
  }

  isShowingAd = true;
  appOpenAd.show(activity);
}

Kotlin

fun showAdIfAvailable(activity: Activity, onShowAdCompleteListener: OnShowAdCompleteListener) {
  // If the app open ad is already showing, do not show the ad again.
  if (isShowingAd) {
    Log.d(TAG, "The app open ad is already showing.")
    return
  }

  // If the app open ad is not available yet, invoke the callback then load the ad.
  if (appOpenAd == null) {
    Log.d(TAG, "The app open ad is not ready yet.")
    onShowAdCompleteListener.onShowAdComplete()
    // Load an ad.
    return
  }

  isShowingAd = true
  appOpenAd?.show(activity)
}

ตั้งค่า FullScreenContentCallback

FullScreenContentCallback จะจัดการเหตุการณ์ที่เกี่ยวข้องกับการแสดงAppOpenAd ก่อนแสดง AppOpenAd โปรดตั้งค่า Callback ดังนี้

Java

appOpenAd.setFullScreenContentCallback(
    new FullScreenContentCallback() {
      @Override
      public void onAdDismissedFullScreenContent() {
        // Called when full screen content is dismissed.
        Log.d(TAG, "Ad dismissed fullscreen content.");
        // Don't forget to set the ad reference to null so you
        // don't show the ad a second time.
        appOpenAd = null;
        isShowingAd = false;

        onShowAdCompleteListener.onShowAdComplete();
        // Load an ad.
      }

      @Override
      public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) {
        // Called when full screen content failed to show.
        Log.d(TAG, adError.getMessage());
        appOpenAd = null;
        // Don't forget to set the ad reference to null so you
        // don't show the ad a second time.
        isShowingAd = false;

        onShowAdCompleteListener.onShowAdComplete();
        // Load an ad.
      }

      @Override
      public void onAdShowedFullScreenContent() {
        Log.d(TAG, "Ad showed fullscreen content.");
      }

      @Override
      public void onAdImpression() {
        // Called when an impression is recorded for an ad.
        Log.d(TAG, "The ad recorded an impression.");
      }

      @Override
      public void onAdClicked() {
        // Called when ad is clicked.
        Log.d(TAG, "The ad was clicked.");
      }
    });

Kotlin

appOpenAd?.fullScreenContentCallback =
  object : FullScreenContentCallback() {
    override fun onAdDismissedFullScreenContent() {
      // Called when full screen content is dismissed.
      Log.d(TAG, "Ad dismissed fullscreen content.")
      // Don't forget to set the ad reference to null so you
      // don't show the ad a second time.
      appOpenAd = null
      isShowingAd = false

      onShowAdCompleteListener.onShowAdComplete()
      // Load an ad.
    }

    override fun onAdFailedToShowFullScreenContent(adError: AdError) {
      // Called when full screen content failed to show.
      Log.d(TAG, adError.message)
      // Don't forget to set the ad reference to null so you
      // don't show the ad a second time.
      appOpenAd = null
      isShowingAd = false

      onShowAdCompleteListener.onShowAdComplete()
      // Load an ad.
    }

    override fun onAdShowedFullScreenContent() {
      Log.d(TAG, "Ad showed fullscreen content.")
    }

    override fun onAdImpression() {
      // Called when an impression is recorded for an ad.
      Log.d(TAG, "The ad recorded an impression.")
    }

    override fun onAdClicked() {
      // Called when ad is clicked.
      Log.d(TAG, "The ad was clicked.")
    }
  }

พิจารณาการหมดอายุของโฆษณา

เพื่อไม่ให้แสดงโฆษณาที่หมดอายุ ให้เพิ่มเมธอดลงใน AppOpenAdManager ที่จะตรวจสอบระยะเวลาที่ผ่านไปนับตั้งแต่โหลดการอ้างอิงโฆษณา จากนั้นใช้เมธอดดังกล่าวเพื่อตรวจสอบว่าโฆษณายังใช้ได้อยู่หรือไม่

Java

/** Check if ad was loaded more than n hours ago. */
private boolean wasLoadTimeLessThanNHoursAgo(long numHours) {
  long dateDifference = (new Date()).getTime() - loadTime;
  long numMilliSecondsPerHour = 3600000;
  return (dateDifference < (numMilliSecondsPerHour * numHours));
}

/** Check if ad exists and can be shown. */
private boolean isAdAvailable() {
  // For time interval details, see: https://support.google.com/admob/answer/9341964
  return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4);
}

Kotlin

/** Check if ad was loaded more than n hours ago. */
private fun wasLoadTimeLessThanNHoursAgo(numHours: Long): Boolean {
  val dateDifference: Long = Date().time - loadTime
  val numMilliSecondsPerHour: Long = 3600000
  return dateDifference < numMilliSecondsPerHour * numHours
}

/** Check if ad exists and can be shown. */
private fun isAdAvailable(): Boolean {
  // For time interval details, see: https://support.google.com/admob/answer/9341964
  return appOpenAd != null && wasLoadTimeLessThanNHoursAgo(4)
}

ติดตามกิจกรรมปัจจุบัน

หากต้องการแสดงโฆษณา คุณจะต้องมีบริบท Activity หากต้องการติดตามกิจกรรมล่าสุดที่ใช้ ให้ลงทะเบียนและใช้ Application.ActivityLifecycleCallbacks

Java

@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {}

@Override
public void onActivityStarted(@NonNull Activity activity) {
  // An ad activity is started when an ad is showing, which could be AdActivity class from Google
  // SDK or another activity class implemented by a third party mediation partner. Updating the
  // currentActivity only when an ad is not showing will ensure it is not an ad activity, but the
  // one that shows the ad.
  if (!appOpenAdManager.isShowingAd) {
    currentActivity = activity;
  }
}

@Override
public void onActivityResumed(@NonNull Activity activity) {}

@Override
public void onActivityPaused(@NonNull Activity activity) {}

@Override
public void onActivityStopped(@NonNull Activity activity) {}

@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}

@Override
public void onActivityDestroyed(@NonNull Activity activity) {}

Kotlin

override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}

override fun onActivityStarted(activity: Activity) {
  // An ad activity is started when an ad is showing, which could be AdActivity class from Google
  // SDK or another activity class implemented by a third party mediation partner. Updating the
  // currentActivity only when an ad is not showing will ensure it is not an ad activity, but the
  // one that shows the ad.
  if (!appOpenAdManager.isShowingAd) {
    currentActivity = activity
  }
}

override fun onActivityResumed(activity: Activity) {}

override fun onActivityPaused(activity: Activity) {}

override fun onActivityStopped(activity: Activity) {}

override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}

override fun onActivityDestroyed(activity: Activity) {}

registerActivityLifecycleCallbacks ช่วยให้คุณฟังเหตุการณ์ Activity ทั้งหมดได้ การฟังเมื่อกิจกรรมเริ่มต้นและสิ้นสุดลงจะช่วยให้คุณติดตามการอ้างอิงไปยัง Activity ปัจจุบันได้ ซึ่งคุณจะใช้ในการแสดงโฆษณาเปิดแอป

รอเหตุการณ์การนำแอปไปไว้เบื้องหน้า

หากต้องการฟังเหตุการณ์ที่แอปทำงานอยู่เบื้องหน้า ให้ทำตามขั้นตอนต่อไปนี้

เพิ่มไลบรารีลงในไฟล์ Gradle

หากต้องการรับการแจ้งเตือนเกี่ยวกับเหตุการณ์การนำแอปไปไว้เบื้องหน้า คุณต้องลงทะเบียน DefaultLifecycleObserver เพิ่มทรัพยากร Dependency ลงในไฟล์บิลด์ระดับแอป โดยทำดังนี้

Kotlin

  dependencies {
    implementation("com.google.android.gms:play-services-ads:25.5.0")
    implementation("androidx.lifecycle:lifecycle-process:2.8.3")
  }

ดึงดูด

  dependencies {
    implementation 'com.google.android.gms:play-services-ads:25.5.0'
    implementation 'androidx.lifecycle:lifecycle-process:2.8.3'
  }

ใช้อินเทอร์เฟซ LifecycleObserver

คุณสามารถรอเหตุการณ์การนำแอปไปไว้เบื้องหน้าได้โดยใช้อินเทอร์เฟซ DefaultLifecycleObserver

ใช้ onStart() เพื่อแสดงโฆษณาเปิดแอป

Java

@Override
public void onStart(@NonNull LifecycleOwner owner) {
  DefaultLifecycleObserver.super.onStart(owner);
  // Show the ad (if available) when the app moves to foreground.
  appOpenAdManager.showAdIfAvailable(currentActivity);
}

Kotlin

override fun onStart(owner: LifecycleOwner) {
  super.onStart(owner)
  currentActivity?.let {
    // Show the ad (if available) when the app moves to foreground.
    appOpenAdManager.showAdIfAvailable(it)
  }
}

Cold Start และหน้าจอโหลด

เอกสารประกอบที่ผ่านมาถือว่าคุณแสดงโฆษณาเปิดแอปเฉพาะเมื่อผู้ใช้เปิดแอปของคุณขึ้นมาเป็นแอปที่ใช้งานอยู่เมื่อแอปถูกระงับในหน่วยความจำ "การเริ่มใหม่ทั้งหมด" จะเกิดขึ้นเมื่อแอปเปิดขึ้นแต่ไม่ได้ถูกระงับไว้ในหน่วยความจำก่อนหน้านี้

ตัวอย่างของ Cold Start คือเมื่อผู้ใช้เปิดแอปเป็นครั้งแรก เมื่อเปิดแอปแบบ Cold Start คุณจะไม่มีโฆษณาเปิดแอปที่โหลดไว้ก่อนหน้านี้ซึ่งพร้อมแสดงทันที ความล่าช้าระหว่างเวลาที่คุณขอโฆษณาและได้รับโฆษณากลับมาอาจทำให้เกิดสถานการณ์ที่ผู้ใช้สามารถใช้แอปของคุณได้เป็นเวลาสั้นๆ ก่อนที่จะตกใจกับโฆษณาที่อยู่นอกบริบท หลีกเลี่ยงการทำเช่นนี้เนื่องจากจะทำให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ไม่ดี

วิธีที่แนะนำในการใช้โฆษณาเปิดแอปใน Cold Start คือการใช้หน้าจอการโหลดเพื่อโหลดชิ้นงานเกมหรือชิ้นงานแอป และแสดงโฆษณาจากหน้าจอการโหลดเท่านั้น หากแอปโหลดเสร็จแล้วและส่งผู้ใช้ไปยังเนื้อหาหลักของแอปแล้ว อย่าแสดงโฆษณา

แนวทางปฏิบัติแนะนำ

โฆษณาเปิดแอปช่วยให้คุณสร้างรายได้จากหน้าจอการโหลดของแอปเมื่อเปิดแอปครั้งแรกและระหว่างการสลับแอป แต่คุณควรคำนึงถึงแนวทางปฏิบัติแนะนำเพื่อให้ผู้ใช้เพลิดเพลินกับการใช้แอปของคุณ โดยแนวทางปฏิบัติแนะนำมีดังนี้

  • แสดงโฆษณาเปิดแอปรายการแรกหลังจากที่ผู้ใช้ใช้แอปไปแล้ว 2-3 ครั้ง
  • แสดงโฆษณาเปิดแอปในช่วงเวลาที่ผู้ใช้ต้องรอให้แอปโหลด
  • หากคุณมีหน้าจอการโหลดอยู่ใต้โฆษณาเปิดแอป และหน้าจอการโหลดโหลดเสร็จก่อนที่โฆษณาจะปิด คุณอาจต้องปิดหน้าจอการโหลดในเมธอด onAdDismissedFullScreenContent()

ตัวอย่างใน GitHub

  • ตัวอย่างโฆษณาเปิดแอป: Java | Kotlin

ขั้นตอนถัดไป

สำรวจหัวข้อต่อไปนี้