Splash's advertisements rely on developers to create their own Activity. They only need to add the container that displays the advertisement ViewGroup strong> Just pass the api to Splash and use it. Splash will automatically render ads to ViewGroup;
Cold start (the initial startup of the application when the application process does not exist):
Hot start (the application temporarily retreats to the background through the home button, and returns to the application while the application process still exists):
Statistics after entering the scene where ads can be displayed:
Ad preloading:
Open screen advertising configuration:
Preset policy configuration:
1.SplashThe display area of the ad is the largest It is best to be more than 75% of the screen height and skip seconds for more than 3 seconds, otherwise the ad display may be invalid;
2.SplashWhen the ad is displayed It is recommended that the incoming container remain visible (View.VISIBLE) before loading the ad, to avoid dynamic hiding of the display causing failure to display the ad.
3. Avoid calling the show interface to display ads when the app is in the background or the screen is turned off. If the app is not in the foreground, the display of open-screen ads may fail.
4. It is forbidden to execute the ad loading method in the onNoAdError callback, otherwise it will cause a lot of useless requests and may cause the application to freeze
5. Some platforms do not pause the countdown after jumping to the landing page. Even if you are viewing the landing page, onAdDismiss will still be called back after the countdown ends. Therefore, special processing is required when the page jumps. Please refer to the sample code for details.
6.Splash does not support horizontal screen applications. (Pangolin advertising platform supports horizontal screen, you need to contact Pangolin for application; other platforms need to contact advertising platform for enquiry)
7. Support HUAWEI (HMS) Open-screen ads support Sigmob's open-screen ads.
ATSplashAd: Splash ad loading class
method | Parameters | Description |
---|---|---|
ATSplashAd | (Context context, String placementId, ATSplashAdListener listener, int fetchAdTimeout) | |
ATSplashAd | (Context context, String placementId, ATSplashAdListener listener) | Splash initialization method< br>The meaning of the parameters is the same as above |
loadAd | - | Initiate ad loading |
Ad loading:
ATSplashAd splashAd = new ATSplashAd(context, placementId, listner, 5000);
splashAd.loadAd();
ATSplashAd:
Method | Parameters | Description |
---|---|---|
isAdReady | - | Determine whether there are ads that can be displayed in the current ATSplashAd |
show | (Activity activity, ViewGroup container) | Display Splash ads, the following is a parameter description:< br>activity: activity that displays ads container: Container for displaying ads |
show | (Activity activity , final ViewGroup container, ATSplashSkipInfo atSplashSkipInfo) | Use custom SkipView to display Splash ads The meaning of parameters is the same as above atSplashSkipInfo: Customized SkipView function class Customized SkipView is only valid for the following ads: MyOffer, Adx, OnlineAPI, Pangolin Please refer to Demo |
(Deprecated since v6.3.10) Specify the scene to display Splash ads. The following is the parameter description: activity : activity that displays ads container: activity that displays ads Container scenario: Ad display scene, scene parameters can be created from the background, please refer to Advertising scenario | ||
show | (Activity activity, ViewGroup container, ATShowConfig showConfig) | (v6.3.10+) Display Splash ads. The following is the parameter description: activity : activity that displays ads container: activity that displays ads Container showConfig: You can pass in additional parameters during display, as follows 1.ATShowConfig#showCustomExt(String showCustomExt): You can pass in custom parameters during display, and the parameters passed in will be returned through ATAdInfo#getShowCustomExt() 2.ATShowConfig#scenarioId(String scenarioId): Advertising scenarios can be passed in, the same as getNativeAd(String scenario) |
(Deprecated since v6.3.10) Specify scenario usage Customize SkipView to display Splash ads The parameter meaning is the same as above atSplashSkipInfo: Customize SkipView Functional class Customized SkipView is only valid for the following ads: MyOffer, Adx, OnlineAPI, pangolin Please refer to Demo | ||
show | (Activity activity, final ViewGroup container, ATSplashSkipInfo atSplashSkipInfo, ATShowConfig showConfig) | (v6.3.10+) usage Customize SkipView to display Splash ads The parameter meaning is the same as above atSplashSkipInfo: Customize SkipView Functional class showConfig: You can pass in additional parameters during display, as follows 1.ATShowConfig#showCustomExt(String showCustomExt): You can pass in custom parameters during display, and the parameters passed in will be returned through ATAdInfo#getShowCustomExt() 2.ATShowConfig#scenarioId(String scenarioId): Advertising scenarios can be passed in, the same as getNativeAd(String scenario) |
(static ) entryAdScenario | (String placementId, String scenarioId) | Enter the business scenario and enter the current ad space cache status statistics. The scenario refers to the advertising display scene (not required, null can be passed directly). Scene parameters can be created from the background and please refer to Business scenario cache status statistics |
Ad display:
/*
In order to calculate the scene arrival rate, relevant information can be consulted“ https://docs.toponad.com/#/zh -CN/android/NetworkAccess/scenario/scenario“
Call the "Enter Advertising Scene" method when the advertising triggering conditions are met, for example:
**If an advertisement pops up after the cleaning is completed, it will be called at the end of the cleaning;
*1. First call "entryAdScenario"
*2. Can calling "isAdReady" display
*3. Finally, call "show" to display
*4. Scenario ID is passed in to the backend scene management for data display (not mandatory)
*/
ATSplashAd.entryAdScenario("your splash placementID", "your scenarioID");
//Before displaying, it is necessary to check that the advertisement has a cache and that the current activity is in the foreground
if (splashAd.isAdReady() && inForeBackground) {
//The container size should occupy at least 75% of the screen
splashAd.show(activity, container,"your scenarioID");
}
Pass in custom parameters when ad displaying:
TopOn SDK v6.3.10 and above supports developers to pass in custom parameters during ad display. The custom parameters passed in during display are independent of the custom parameters passed in during load. Custom parameters passed in during presentation can be returned in the TopOn SDK callback information.
ATSplashAd:
Method | Parameters | Description | Description |
---|---|---|---|
setLocalExtra | (Map<String, Object> map) | Set local parameters and obtain the key through ATAdConst.KEY |
ATAdConst.KEY: LocalExtra local parameter predefined Key value
Key | Description |
---|---|
AD_WIDTH | Ad width |
AD_HEIGHT | Ad height |
ATSplashAd:
Method | Parameter | Description |
---|---|---|
checkAdStatus | - | Get the status object ATAdStatusInfo of the current advertising slot, ATAdStatusInfo |
checkValidAdCaches | - | query the ATAdInfo object of all cached information of the current advertising slot ATAdInfo: the information object of the advertisement, which can distinguish the advertising platform, mainly including the third-party aggregation platform id informationSee ATAdInfo information description |
ATAdStatusInfo: the status object of the advertising slot
Method | Parameters | Description |
---|---|---|
isLoading | - | |
isReady | - | Determine whether there are ads that can be displayed in the current ad slot, which has the same effect as the ATSplashAd.isAdReady() method |
getATTopAdInfo | - | Get the current advertising space first The highest level advertising cache information ATAdInfo object ATAdInfo: advertising information object, which can distinguish advertising platforms, mainly including the id information of third-party aggregation platforms See ATAdInfo Information description |
ATSplashAdListener: Splash ad event callback class
Method | Parameters | Description |
---|---|---|
onAdLoaded | (boolean isTimeout) | Ad loading success callback isTimeout: When the ad is loaded successfully, does it exceed the fetchAdTimeoutspecified time |
onNoAdError | (AdError error) | |
onAdShow | (ATAdInfo atAdInfo) | Ad display callback< br>ATAdInfo: The information object of advertising can distinguish advertising platforms, mainly including the id information of third-party aggregation platforms See ATAdInfo information description |
onAdClick | ( ATAdInfo atAdInfo) | Ad click callback The meaning of the parameters is the same as above |
onAdDismiss | (ATAdInfo entity, ATSplashAdExtraInfo splashAdExtraInfo) | Ad closing callback The meaning of the parameters is the same as above ATSplashAdExtraInfo: Additional information for closing the open-screen ad includes the screen-dotted ad control interface class. Developers can pass This interface controls the display of highlight ads Note: (1) WhenPangolin, Youlianghui’s opening screen creative supports eye-touching, splashEyeAd is not null (2) When a Kuaishou open-screen advertisement is displayed, splashEyeAd is a non-null value, but it does not necessarily mean that the material of the Kuaishou open-screen advertisement supports eye-catching, When it is not supported, calling the IATSplashEyeAd#show() method will directly call back the ATSplashEyeAdListener#onAdDismiss() method (3) When splashEyeAd is not null, but the developer does not want to support the eye-catching function, You must call splashEyeAd.destroy() to release resources, and then jump to the main page or remove the open screen View |
onAdLoadTimeout | - | Ad loading timeout callback, you can perform screen opening ad loading timeout processing here Note: (1) After the ad loading timeout callback, the open-screen ad is still loading. If the loading is successful, onAdLoaded will be triggered. (true) (2) If the open-screen advertisement loaded this time is not displayed, it will be placed in the cache for next display |
ATSplashExListener: Inherited from ATSplashAdListener, the method is the same as ATSplashAdListener, additional callback descriptions are as follows:
Method | Parameters | Description |
---|---|---|
onDeeplinkCallback | (ATAdInfo atAdInfo, boolean isSuccess) | deeplink callback, for Adx, OnlineApi ads isSuccess: whether it was successful td> |
onDownloadConfirm | (Context context, ATAdInfo atAdInfo, View clickView, ATNetworkConfirmInfo networkConfirmInfo) | Callback method when the application advertisement is clicked to download. ATNetworkConfirmInfo: Callback information provided by the third-party advertising platform (Currently only GDTDownloadFirmInfo of Youlianghui) ATAdInfo: The information object of the advertisement, which can distinguish the advertising platform, mainly includes the id information of the third-party aggregation platform See ATAdInfo information description |
IATSplashEyeAd: Control class for opening screen eye-catching ads
ATSplashEyeAdListener< /span>:Event callback class for screen-opening ads
Method | Parameters | Description |
---|---|---|
onAnimationStart | (View splashView) | Developers need to perform the animation scaling of the splash screen ad in this callback splashView: View of the open-screen advertisement Note: (1) Zoom animation For sample code, please refer to Demo (2) When the zoom animation ends, you must call IATSplashEyeAd#onFinished() (3)Kuaishou will not trigger this callback and cannot control Kuaishou’s scaling animation |
onAdDismiss | (boolean isSupportEyeSplash, String errorMsg) | Open screen eye-catching ad closing callback, it is recommended to call IATSplashEyeAd#destroy() isSupportEyeSplash: Whether to support opening the screen to dot the eye errorMsg: When an error occurs, this will Display error message Note: Each platform triggers this callback at different times. It may be when the close button is clicked, or when the close button is clicked. At the end of the ad |
ATSplashSkipInfo: Customized SkipView function class
Method | Parameters | Description |
---|---|---|
ATSplashSkipInfo | (View skipView, long countDownDuration, long callbackInterval, ATSplashSkipAdListener atSplashSkipAdListener) | Customized SkipView function class construction method skipView: developer-defined skip button View countDownDuration: total countdown duration(unit: ms), the default is 5s, the minimum can be set to 2s callbackInterval: the trigger interval of the countdown callback(unit: ms), ATSplashSkipAdListener#onAdTick() callback is triggered every 1s by default, the minimum can be set to 20ms atSplashSkipAdListener: Customize SkipView Event listening class Note: (1) When skipView passes in null, it automatically Defining the SkipView function will not take effect (2) If developers want to customize the countdown animation, they can change the trigger interval of the countdown callback through the callbackInterval parameter |
ATSplashSkipInfo | (View skipView, ATSplashSkipAdListener atSplashSkipAdListener) | Customized SkipView function class construction method The meaning of parameters is the same as above |
ATSplashSkipAdListener: Customized SkipView event listening class
Method | Parameters | Description |
---|---|---|
onAdTick | (long duration, long remainder) | Countdown callback, developers can update the countdown animation in this callback duration: total countdown duration(unit: ms) remainder: current remaining countdown progress(unit: ms) |
isSupportCustomSkipView | (boolean isSupport) | The callback notifies the developer whether the currently displayed ad supports custom SkipView isSupport: true means the currently displayed ad platform supports it, false means it does not support it Note: (1) Developers can determine in this callback that when isSupport is true, skipView is set to visible |
String defaultConfig = "";
//To set up the first screen opening advertisement source, please export the configuration of the screen opening advertisement source from the TopOn backend
/*defaultConfig = "{\"unit_id\":1442678,\"nw_firm_id\":15,\"adapter_class\":\"com.anythink.network.toutiao.TTATSplashAdapter\",\"content\":\"{\\\"button_type\\\":\\\"0\\\",\\\"dl_type\\\":\\\"0\\\",\\\"slot_id\\\":\\\"100011\\\",\\\"personalized_template\\\":\\\"0\\\",\\\"zoomoutad_sw\\\":\\\"1\\\",\\\"app_id\\\":\\\"5001121\\\"}\"}";*/
ATSplashAd splashAd = new ATSplashAd(context, placementId, listner, 5000, defaultConfig);
splashAd.loadAd();
/*
In order to calculate the scene arrival rate, relevant information can be consulted“ https://docs.toponad.com/#/zh -CN/android/NetworkAccess/scenario/scenario“
Call the "Enter Advertising Scene" method when the advertising triggering conditions are met, for example:
**If an advertisement pops up after the cleaning is completed, it will be called at the end of the cleaning;
*1. First call "entryAdScenario"
*2. Can calling "isAdReady" display
*3. Finally, call "show" to display
*4. Scenario ID is passed in to the backend scene management for data display (not mandatory)
*/
ATSplashAd.entryAdScenario("your splash placementID", "your scenarioID");
//Before displaying, it is necessary to check that the advertisement has a cache and that the current activity is in the foreground
if (splashAd.isAdReady() && inForeBackground) {
//The container size should occupy at least 75% of the screen
splashAd.show(activity, container,"your scenarioID");
}
Details For on-screen advertising sample code, please refer to: Demo's SplashAdActivity class
Cold start example:
ATSplashExListener listener = new ATSplashExListener() {
......
@Override
public void onAdLoaded(boolean isTimeout) {
//When loading without timeout
if(!isTimeout){
//Advertising display when the current activity is in the foreground
if(inForeBackground){
//The container size should occupy at least 75% of the screen
splashAd.show(activity, container);
}else{
//Wait for the application to return to the front-end before displaying it
needShowSplashAd = true;
}
}
}
@Override
public void onAdLoadTimeout() {
//After loading timeout, directly enter the main interface
jumpToMainActivity();
}
@Override
public void onNoAdError(AdError adError) {
//Loading failed, directly enter the main interface
jumpToMainActivity();
}
@Override
public void onAdShow(ATAdInfo entity) {
}
@Override
public void onAdDismiss(ATAdInfo entity, ATSplashAdExtraInfo splashAdExtraInfo) {
//=1 indistinguishable=2 skip end=3 countdown end=4 click ad end=99 open screen display failure
if(splashAdExtraInfo.getDismissType()==ATAdConst.DISMISS_TYPE.SHOWFAILED){
}
//Enter the main interface after opening and closing the screen advertising display
//Note: Some platforms do not pause the countdown after jumping to the landing page. Even when viewing the landing page, the onAdDismiss callback will still be triggered after the countdown ends
//Therefore, special handling is required when jumping to the page. Please refer to the example code below for details
jumpToMainActivity();
}
......
};
String defaultConfig = "";
//To set up the first screen opening advertisement source, please export the configuration of the screen opening advertisement source from the TopOn backend
defaultConfig = "export json string from server";
ATSplashAd splashAd = new ATSplashAd(context, placementId, listner, 5000, defaultConfig);
if (splashAd.isAdReady()) {
//The container size should occupy at least 75% of the screen
splashAd.show(activity, container);
}else{
splashAd.loadAd();
}
onAdDismiss() open-screen advertising page jump example:
//Do you need to mark page jumps
boolean needJump;
@Override
protected void onResume() {
super.onResume();
if (needJump) {
jumpToMainActivity();
}
needJump = true;
}
@Override
protected void onPause() {
super.onPause();
needJump = false;
}
public void jumpToMainActivity() {
if (!needJump) {
needJump = true;
return;
}
Intent intent = new Intent(this, YourMainActivity.class);
startActivity(intent);
finish();
}
splashAd = new ATSplashAd(this, placementId, atMediationRequestInfo, this, 5000);
Map<String, Object> localMap = new HashMap<>();
localMap.put(ATAdConst.KEY.AD_WIDTH, width);//单位:px
localMap.put(ATAdConst.KEY.AD_HEIGHT, height);//单位:px
splashAd.setLocalExtra(localMap);
splashAd.loadAd();
Note: If the set width and height are different from the display The width and height of the container are inconsistent, or the template rendering options of the TopOn backend do not correspond to the Pangolin backend, which will result in incomplete or blurry or distorted ad display.
(1) Because it may not be possible to load open-screen ads that support eye-catching, so if there is a problem with the fill rate of eye-catching materials for open-screen ads, please contact the advertising platform for processing
(2) For the following sample code, please refer to Demo
1. Create a new SplashEyeAdHolder class to cache IATSplashEyeAd instances< /p>
public class SplashEyeAdHolder {
public static IATSplashEyeAd splashEyeAd;
}
public class SplashAdShowActivity extends Activity implements ATSplashAdListener {
...
@Override
public void onAdDismiss(ATAdInfo entity, ATSplashAdExtraInfo splashAdExtraInfo) {
Log.i(TAG, "onAdDismiss:\n" + entity.toString());
//(1)When the open screen advertising materials of pangolins and Youlianghui support highlight, splashEyeAd is not null
//(2)When a Kwai opening screen advertisement is displayed, splashEyeAd is a non null value, but it does not necessarily mean that the material of the Kwai opening screen advertisement supports the finishing touch. If not, calling the IATSplashEyeAd # show() method will directly call back the ATSplashEyeAdListener # onAdDismiss() method
//(3)When splashEyeAd is not null, but developers do not want to support the highlight feature, they must call splashEyeAd. destroy() to release resources, then jump to the main page or remove the open screen view
SplashEyeAdHolder.splashEyeAd = splashAdExtraInfo.getAtSplashEyeAd();
jumpToMainActivity();
}
}
2. Set the information related to opening the screen (please refer to Demo for SplashZoomOutManager), jump to the homepage Activity and cancel the page jump animation, and close the current page
public class SplashAdShowActivity extends Activity implements ATSplashAdListener {
...
public void jumpToMainActivity() {
if (!hasHandleJump) {
hasHandleJump = true;
if (SplashEyeAdHolder.splashEyeAd != null) {
try {
SplashZoomOutManager zoomOutManager = SplashZoomOutManager.getInstance(getApplicationContext());
zoomOutManager.setSplashInfo(container.getChildAt(0),
getWindow().getDecorView());
} catch (Throwable e) {
Log.e(TAG, "jumpToMainActivity: ------------------------------------------ error");
e.printStackTrace();
}
Intent intent = new Intent(this, TestMainActivity.class);
startActivity(intent);
overridePendingTransition(0, 0);
}
finish();
Toast.makeText(this, "start your MainActivity.", Toast.LENGTH_SHORT).show();
}
}
}
3. In the homepage Activity, create the showSplashEyeAd() method
public class TestMainActivity extends Activity {
...
private void showSplashEyeAd() {
if (SplashEyeAdHolder.splashEyeAd == null) {
return;
}
SplashEyeAdHolder.splashEyeAd.show(TestMainActivity.this, null, new ATSplashEyeAdListener() {
@Override
public void onAnimationStart(View splashView) {
//Execute scaling animation
SplashZoomOutManager zoomOutManager = SplashZoomOutManager.getInstance(getApplicationContext());
//It is recommended to prioritize using the size returned by IATSplashEyeAd # getSuggestedSize() as the target size for scaling animations
int[] suggestedSize = SplashEyeAdHolder.splashEyeAd.getSuggestedSize(getApplicationContext());
if (suggestedSize != null) {
zoomOutManager.setSplashEyeAdViewSize(suggestedSize[0], suggestedSize[1]);
}
zoomOutManager.startZoomOut((ViewGroup) getWindow().getDecorView(),
findViewById(android.R.id.content), new SplashZoomOutManager.AnimationCallBack() {
@Override
public void animationStart(int animationTime) {
}
@Override
public void animationEnd() {
Log.i(TAG, "animationEnd---------: eye ad");
//When the scaling animation is completed, IATSplashEyeAd # onFinished() must be called to notify the SDK
SplashEyeAdHolder.splashEyeAd.onFinished();
}
});
}
@Override
public void onAdDismiss(boolean isSupportEyeSplash, String errorMsg) {
Log.i(TAG, "onAdDismiss---------: close eye ad");
//It is recommended to call IATPlashEyeAd # destroy() in this callback to release resources and other resources to avoid memory leaks
SplashZoomOutManager zoomOutManager = SplashZoomOutManager.getInstance(getApplicationContext());
zoomOutManager.clearStaticData();
SplashEyeAdHolder.splashEyeAd.destroy();
SplashEyeAdHolder.splashEyeAd = null;
}
});
}
}
4. In the homepage Activity, call showSplashEyeAd() to display the eye-catching ad (it is recommended to call back in onAttachedToWindow() Call showSplashEyeAd())
public class TestMainActivity extends Activity {
...
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
showSplashEyeAd();
}
}
public class SplashAdShowActivity extends Activity implements ATSplashAdListener {
...
@Override
public void onAdDismiss(ATAdInfo entity, IATSplashEyeAd splashEyeAd) {
Log.i(TAG, "onAdDismiss:\n" + entity.toString());
//(1) When the open screen advertising materials of pangolins and Youlianghui support highlight, splashEyeAd is not null
//(2) When a Kwai opening screen advertisement is displayed, splashEyeAd is a non null value, but it does not necessarily mean that the material of the Kwai opening screen advertisement supports the finishing touch. If not, calling the IATSplashEyeAd # show() method will directly call back the ATSplashEyeAdListener # onAdDismiss() method
//(3) When splashEyeAd is not null, but developers do not want to support the highlight feature, they must call splashEyeAd. destroy() to release resources, then jump to the main page or remove the open screen view
if (container != null) {
container.removeAllViews();
container.setVisibility(View.GONE);
}
//Display highlight advertisements
showSplashEyeAd(splashEyeAd);
}
private void showSplashEyeAd(IATSplashEyeAd splashEyeAd) {
if (splashEyeAd == null) {
return;
}
splashEyeAd.show(SplashAdShowInCurrentActivity.this, null, new ATSplashEyeAdListener() {
@Override
public void onAnimationStart(View splashView) {
//Execute scaling animation
SplashZoomOutManager zoomOutManager = SplashZoomOutManager.getInstance(getApplicationContext());
//It is recommended to prioritize using the size returned by IATSplashEyeAd # getSuggestedSize() as the target size for scaling animations
int[] suggestedSize = splashEyeAd.getSuggestedSize(getApplicationContext());
if (suggestedSize != null) {
zoomOutManager.setSplashEyeAdViewSize(suggestedSize[0], suggestedSize[1]);
}
zoomOutManager.setSplashInfo(splashView, getWindow().getDecorView());
ViewGroup content = findViewById(android.R.id.content);
zoomOutManager.startZoomOut(splashView, content, content, new SplashZoomOutManager.AnimationCallBack() {
@Override
public void animationStart(int animationTime) {
}
@Override
public void animationEnd() {
Log.i(TAG, "animationEnd---------: eye ad");
//When the scaling animation is completed, IATSplashEyeAd # onFinished() must be called to notify the SDK
splashEyeAd.onFinished();
}
});
}
@Override
public void onAdDismiss(boolean isSupportEyeSplash, String errorMsg) {
Log.i(TAG, "onAdDismiss---------: eye ad");
//It is recommended to call IATPlashEyeAd # destroy() in this callback to release resources and other resources to avoid memory leaks
SplashZoomOutManager zoomOutManager = SplashZoomOutManager.getInstance(getApplicationContext());
zoomOutManager.clearStaticData();
splashEyeAd.destroy();
}
});
}
}
Background: The first time an open-screen advertisement is loaded when an application is installed, TopOn needs to pull the configured ad slot information from the background and cache it locally before going to Requesting advertisements from the advertising platform involves two network requests (serial), which affects the loading efficiency of the opening screen advertisement. The following provides two methods to improve the loading efficiency of the first opening screen after the application is installed.
In order to improve the ad loading effect of the first cold start, create a traffic grouping of the SDK preset strategy on the open screen ad slot, and then Configure waterfall flow for this traffic grouping. It is also recommended that you add a bottom-up advertising source, and finally export the SDK preset strategy and preset it into the application. For specific access documents, see SDK Preset Strategy Usage Instructions.
Configuration effect: It can implement the SDK's preset screen opening strategy, while also providing a backup function for advertising sources. That is, this advertising source will initiate requests in parallel with the overall waterfall flow under the advertising space. And users do not necessarily use backdoor ads on their first request, but instead follow the normal parallel request of waterfall flow and backdoor ad sources. It can achieve maximum realization value.
Note: The timing of using the preset policy is only called when there is no cache policy available locally.