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

ข้อกำหนดเบื้องต้น
ตั้งค่า Google Mobile Ads SDK ก่อนดำเนินการต่อ
ทดสอบด้วยโฆษณาทดสอบเสมอ
เมื่อสร้างและทดสอบแอป โปรดใช้โฆษณาทดสอบแทนโฆษณาจริง หากไม่ปฏิบัติตามอาจทำให้บัญชีของคุณถูกระงับ
วิธีที่ง่ายที่สุดในการโหลดโฆษณาทดสอบคือการใช้รหัสหน่วยโฆษณาทดสอบเฉพาะสำหรับโฆษณาเปิดแอป
ca-app-pub-3940256099942544/9257395921
ซึ่งได้รับการกำหนดค่าเป็นพิเศษให้แสดงโฆษณาทดสอบสำหรับทุกคำขอ และคุณสามารถใช้รหัสนี้ในแอปของคุณเองได้อย่างอิสระขณะเขียนโค้ด ทดสอบ และแก้ไขข้อบกพร่อง เพียงตรวจสอบว่าคุณได้แทนที่รหัสนี้ด้วยรหัสหน่วยโฆษณาของคุณเองก่อนเผยแพร่แอป
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีทำงานของโฆษณาทดสอบ Google Mobile Ads SDK ได้ที่หัวข้อ เปิดใช้โฆษณาทดสอบ
ขยายคลาสแอปพลิเคชัน
สร้างคลาสใหม่ที่ขยายคลาส 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 สาธารณะในอินสแตนซ์ Singleton MyApplication คลาส Application จะเชื่อมต่อกับโค้ดส่วนอื่นๆ โดยมอบหมายงานในการโหลดและแสดงโฆษณาให้กับผู้จัดการ
โหลดโฆษณา
ขั้นตอนถัดไปคือการกรอกข้อมูลในเมธอด loadAd() และจัดการการเรียกกลับการโหลดโฆษณา
Java
Kotlin
แทนที่ 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:25.2.0") implementation("androidx.lifecycle:lifecycle-process:2.8.3") }
Groovy
dependencies { implementation 'com.google.android.gms:play-services-ads:25.2.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 คุณจะไม่มีโฆษณาเปิดแอปที่โหลดไว้ก่อนหน้านี้ซึ่งพร้อมแสดงทันที ความล่าช้าระหว่างเวลาที่คุณส่งคำขอโฆษณาและเวลาที่คุณได้รับโฆษณาคืนมาอาจทำให้เกิดสถานการณ์ที่ผู้ใช้สามารถใช้แอปของคุณได้ชั่วครู่ก่อนที่จะประหลาดใจกับโฆษณาที่ไม่เกี่ยวข้อง คุณควรหลีกเลี่ยงสถานการณ์นี้เนื่องจากทำให้ผู้ใช้ได้รับประสบการณ์ที่ไม่ดี
วิธีที่แนะนำในการใช้โฆษณาเปิดแอปในกรณีของ Cold Start คือการใช้หน้าจอโหลดเพื่อโหลดเกมหรือชิ้นงานของแอป และแสดงโฆษณาจากหน้าจอโหลดเท่านั้น หากแอปโหลดเสร็จแล้วและส่งผู้ใช้ไปยังเนื้อหาหลักของแอปแล้ว ก็อย่าแสดงโฆษณา
แนวทางปฏิบัติแนะนำ
โฆษณาเปิดแอปช่วยให้คุณสร้างรายได้จากหน้าจอโหลดของแอป เมื่อเปิดแอปเป็นครั้งแรกและระหว่างการเปลี่ยนแอป แต่คุณควรคำนึงถึงแนวทางปฏิบัติแนะนำเพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ดีในการใช้แอป โดยแนวทางปฏิบัติแนะนำมีดังนี้
- แสดงโฆษณาเปิดแอปครั้งแรกหลังจากที่ผู้ใช้ใช้แอปของคุณ 2-3 ครั้ง
- แสดงโฆษณาเปิดแอปในช่วงเวลาที่ผู้ใช้ต้องรอให้แอปโหลด
- หากคุณมีหน้าจอโหลดอยู่ใต้โฆษณาเปิดแอป และหน้าจอโหลดโหลดเสร็จก่อนที่จะปิดโฆษณา คุณอาจต้องการปิดหน้าจอโหลดในเมธอด
onAdDismissedFullScreenContent()
ตัวอย่างใน GitHub
ขั้นตอนถัดไป
สำรวจหัวข้อต่อไปนี้