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

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

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

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

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

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

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

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

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

ca-app-pub-3940256099942544/9257395921

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

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

ขยายคลาส 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 :
  MultiDexApplication(), Application.ActivityLifecycleCallbacks, DefaultLifecycleObserver {

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

  override fun onCreate() {
    super<MultiDexApplication>.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 สาธารณะในอินสแตนซ์ Singleton MyApplication Application คลาสจะเชื่อมต่อกับโค้ดที่เหลือ โดยมอบหมายงานในการโหลดและแสดงโฆษณาให้กับเครื่องมือจัดการ

โหลดโฆษณา

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

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 โปรดตั้งค่าการเรียกกลับดังนี้

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:24.5.0")
    implementation("androidx.lifecycle:lifecycle-process:2.8.3")
  }

ดึงดูด

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

ใช้การเชื่อมต่อ Lifecycle Observer

คุณรอเหตุการณ์การนำไปไว้เบื้องหน้าได้โดยการใช้ อินเทอร์เฟซ 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

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

ดูหัวข้อต่อไปนี้