/**
* 默认尺寸构造器(Banner 的宽高都是 WRAP_CONTENT 效果)
* @param context 上下文
* @param adUnitID 广告位Id
*/
public BannerAdView (Context context , String adUnitID )
/**
* 自定义尺寸构造器
* @param context 上下文
* @param adUnitID 广告位Id
* @param width 广告的宽度
* @param height 广告的高度 (宽度和高度计量单位为px)
*/
public BannerAdView (Context context , String adUnitID , int width , int height )
/**
* 添加一个banner广告的的示例代码
*/
private void showBanner (){
//设置banner在父容器中的位置
FrameLayout .LayoutParams layoutParams =
new FrameLayout .LayoutParams (FrameLayout .LayoutParams .WRAP_CONTENT , FrameLayout .LayoutParams .WRAP_CONTENT );
layoutParams .gravity = Gravity .BOTTOM | Gravity .RIGHT ;
final String adUnitID = "2-54-63" ; //广告位id
BannerAdView bannerAdView = new BannerAdView (this , adUnitID ,bannerWidth , bannerHeight );
bannerAdView .setAdListener (new BannerAdListener () {
@ Override
public void onAdShowSuccess (BannerAd ad ) {
// 展示成功
}
@ Override
public void onAdClose (BannerAd ad ) {
// 关闭成功
}
@ Override
public void onAdClick (BannerAd ad ) {
// 广告被点击
}
@ Override
public void onAdShowFailed (int errorCode , BannerAd ad ) {
// 广告展示失败
}
});
//将banner广告添加到父容器
addContentView (bannerAdView , layoutParams );
}
1、加载单个原生广告
原生广告(信息流广告)是内嵌于 App 原生内容中的广告形式,我们提供了 NativeAdView 布局让开发者可以快速自定义展示内容。
NativeAdView 是 FrameLayout 的子类,作为展示原生广告的父布局容器,开发者可以定义 NativeAdView 布局中的元素类型和排列方式,展示内容从广告请求成功后的 NativeAd 中获取。
NativeAd 包括 Title(标题文本), Description(描述文本), ButtonContent(引导按钮文本), IconImage(Icon图片), LogoImage(Logo图片), Images(1-3多张图片展示素材)
/**
* 示例代码:
* 实例化一个NativeAd,并调用loadAd()方法发起广告请求
*/
final String adUnitId = "2-38-90" ;//广告位id
NativeAd ad = new NativeAd (adUnitId );
//ad.disableImageResourcePreload(); // 设置图片资源是否预加载,设置后可利用第三方图片加载库 load 图片 url
ad .setNativeAdListener (new NativeAdListener () {
@ Override
public void onReceiveAd (NativeAd ad ) {
// Native广告加载完成
showNativeAdView (ad );
}
@ Override
public void onFailed (NativeAd ad , int code ) {
switch (code ){
case SDKCode .CODE_BACK_AMOUNT :
// 原生广告返量
case SDKCode .CODE_BLANK_RESPONSE :
// 原生广告留白
break ;
default :
// 原生广告展示失败
break ;
}
}
});
ad .loadAd ();
/**
* 展示NativeAd
*/
private void showNativeAdView (NativeAd ad ) {
NativeAdView nativeAdView = (NativeAdView ) LayoutInflater .from (DemoActivity .this ).inflate (R .layout .ad_native_layout , null );
TextView titleView = (TextView )nativeAdView .findViewById (R .id .ad_view_title );
TextView descriptionView = (TextView )nativeAdView .findViewById (R .id .ad_view_body );
Button actionButton = (Button )nativeAdView .findViewById (R .id .ad_view_action_button );
ImageView iconView = (ImageView )nativeAdView .findViewById (R .id .ad_view_header_image );
ImageView mediaView = (ImageView )nativeAdView .findViewById (R .id .ad_view_image );
ImageView logoView = (ImageView )nativeAdView .findViewById (R .id .item_logo_img );
titleView .setText (ad .getTitle ());
descriptionView .setText (ad .getDescription ());
actionButton .setText (ad .getButtonContent ());
List <NativeAd .Image > images = ad .getImages ();
mediaView .setImageDrawable (images .get (0 ).getDrawable ());
NativeAd .Image icon_image = ad .getIconImage ();
iconView .setImageDrawable (icon_image .getDrawable ());
NativeAd .Image logo_image = ad .getLogoImage ();
logoView .setImageDrawable (logo_image .getDrawable ());
ad .registerView (nativeAdView );
parent_layout .addView (nativeAdView );
}
注意:SDK 默认会预下载广告中的用到的资源图片,可以关闭该功能使用第三方图片加载库实现。
a) 调用 ad.disableImageResourcePreload()
可以关闭图片预加载。调用该方法后,NativeAd.Image
或者其子类中的getDrawabl()
方法将会返回一个空值。此时展示NativeAd
的图片,需调用getUrl()
方法获取图片的URL,然后自行加载(可利用第三方图片加载库完成,如 Glide 或 Fresco 等)
b) 示例代码中的原生广告布局容器R.layout.ad_native_layout
是com.sunteng.ads.nativead.core.NativeAdView
包裹的自定义布局,开发者可以自定义布局中的内容。NativeAdView
是FrameLayout
的子类;
c) NativeAdView
的数据填充完毕之后,需要调用ad.registerView(nativeAdView);
方法,否则SDK无法统计到用户的行为。
2、加载多个原生广告
加载多个原生广告适合一次缓存多个广告的场景,适合在 ListView 或 RecyclerView 等列表式布局中使用。
/**
* 示例代码
* 预加载多个NativeAd备用
*/
final String adUnitId = "2-38-90" ;
NativeAdsManager mNativeAdsManager = new NativeAdsManager (adUnitId , 5 );
mNativeAdsManager .loadAds (new NativeAdsManager .LoadAdsListener () {
@ Override
public void onLoadedAds (String adUnitId , int failedCount ) {
Util .printErrorInfo ("onFailedAds count = " + failedCount );
showContents ();
}
});
/**
*(在adapter中)获取缓存的NativeAd,并展示
*/
NativeAd ad = mNativeAdsManager .nextCacheAd ();
if (nativeAd == null ){
return ;
}
adViewHolder .mAdActionButton .setText (nativeAd .getButtonContent ());
adViewHolder .mAdBodyTextView .setText (nativeAd .getDescription ());
adViewHolder .mAdImageView .setImageDrawable (nativeAd .getImages ().get (0 ).getDrawable ());
adViewHolder .mHeaderImageView .setImageDrawable (nativeAd .getIconImage ().getDrawable ());
adViewHolder .mAdTileTextView .setText (nativeAd .getTitle ());
adViewHolder .mLogoImageView .setImageDrawable (nativeAd .getLogoImage ().getDrawable ());
adViewHolder .mAdView .setTag (position );
nativeAd .registerView ((NativeAdView )adViewHolder .itemView );
a) NativeAdsManager
的构造方法需要两个参数,第一个是广告位ID,第二个是本次请求的原生广告的数量,缓存数量为1-20个之间,如果传入的值大于20,会只缓存20个;
b) NativeAdsManager.LoadAdsListener
是所有广告竞价全部完成之后的回调,onLoadedAds()
的两个参数分别为:广告位ID,本次竞价失败广告数量;
c) *nextCacheAd()*方法会循环获取队列中缓存的广告;
d) NativeAdsManager
中也提供disableImageResourcePreload()
方法设置不预加载图片资源。
具体使用可参考 Samlpe 中的基于 RecyclerView 实现的代码示例。
八、原生广告——视频信息流(VideoNativeAd)
原生广告(信息流视频广告)是将视频广告内容内嵌于 App 原生内容中的广告形式,我们提供了 VideoNativeAdView 布局让开发者可以快速自定义展示内容。视频播放组件内置于 MadieView 中,播放控制依赖于 SDK 内部完成。
VideoNativeAdView 是 FrameLayout 的子类,作为展示原生广告的父布局容器,开发者可以定义 VideoNativeAdView 布局中的元素类型和排列方式,展示内容从广告请求成功后的 VideoNativeAd 实例中获取。
VideoNativeAd 包括 Title(标题文本), Description(描述文本), ButtonContent(引导按钮文本), IconImage(Icon图片), LogoImage(Logo图片), 视频展示素材
// 请求单个视频信息流广告
String adUnitId = "2-43-82" ; //测试广告位id
VideoNativeAd videoNativeAd = new VideoNativeAd (adUnitId );
videoNativeAd .setNativeAdListener (new VideoNativeAdListener () {
@ Override
public void onDisplayAd (VideoNativeAd ad ) {
// 视频信息流广告曝光
}
@ Override
public void onClickAd (VideoNativeAd ad ) {
// 视频信息流广告被点击
}
@ Override
public void onReceiveAd (VideoNativeAd ad ) {
// 视频信息流广告加载完成,可以展示
showVideoNativeAdView (ad );
}
@ Override
public void onFailed (VideoNativeAd ad , int code ) {
// 广告展示失败后会回调,code 对应下面的业务错误码表格
}
});
// 请求广告
videoNativeAd .loadAd ();
// 展示视频信息流广告
void showVideoNativeAdView (VideoNativeAd videoNativeAd ) {
// 判断广告素材资源的可用性
if (!videoNativeAd .isReady ()){
// 广告未加载完成,重新请求
}
// 检查广告是否过期
if (videoNativeAd .checkAdIsExpire ()){
// 广告过期,重新请求
}
// 获取自定义的信息流视频布局 VideoNativeAdView
VideoNativeAdView nativeAdView = (VideoNativeAdView ) LayoutInflater .from (this ).inflate (R .layout .ad_video_native_layout , null );
// 获取自定义展示内容的布局控件
// 展示标题内容的 TextView
TextView titleView = (TextView )nativeAdView .findViewById (com .sunteng .ads .nativead .video .R .id .ad_view_title );
// 展示描述文本的 TextView
TextView descriptionView = (TextView )nativeAdView .findViewById (com .sunteng .ads .nativead .video .R .id .ad_view_body );
// 展示指定动作的 Button
Button actionButton = (Button )nativeAdView .findViewById (com .sunteng .ads .nativead .video .R .id .ad_view_action_button );
// 展示图标的 ImageView
ImageView iconView = (ImageView )nativeAdView .findViewById (com .sunteng .ads .nativead .video .R .id .ad_view_header_image );
// 展示视频素材的 MediaView
MediaView mediaView = (MediaView )nativeAdView .findViewById (com .sunteng .ads .nativead .video .R .id .ad_mediaView );
// 展示logo的 ImageView
ImageView logoView = (ImageView )nativeAdView .findViewById (com .sunteng .ads .nativead .video .R .id .item_logo_img );
// 使用广告请求成功后的 VideoNativeAd 实例获取广告填充内容
// 填充文本内容
titleView .setText (videoNativeAd .getTitle ());
descriptionView .setText (videoNativeAd .getDescription ());
actionButton .setText (videoNativeAd .getButtonContent ());
// 填充视频内容
mediaView .setNativeAd (videoNativeAd );
// 填充图像内容
VideoNativeAd .Image icon_image = videoNativeAd .getIconImage ();
iconView .setImageDrawable (icon_image .getDrawable ());
VideoNativeAd .Image logo_image = videoNativeAd .getLogoImage ();
logoView .setImageDrawable (logo_image .getDrawable ());
// 注册填充好内容的 VideoNativeAdView 到 VideoNativeAd 实例
videoNativeAd .registerView (nativeAdView );
}
为方便开发者对视频播放器的控制需求,SDK 提供如下接口控制播放器相关属性。
/**
* 取消广告视频内容自适应(避免拉伸内容)
* 视频内容可能会无法铺满整个播放器
*/
VideoNativeAd .disableVideoContentAdaptive ();
/**
* 设置广告视频内容自适应,视频画面铺满整个播放器
* 默认开启
*/
VideoNativeAd .enableVideoContentAdaptive ();
设置广告视频静音播放功能(默认关闭,各广告位独立控制)
/**
* 启用视频静音播放功能
*/
VideoNativeAd videoNativeAd .enableMutePlayVideo ();
/**
* 禁用视频静音播放功能
*/
VideoNativeAd videoNativeAd .disableMutePlayVideo ();
设置广告视频自动播放功能(默认关闭,各广告位独立控制)
/**
* 启用视频自动播放功能
*/
VideoNativeAd videoNativeAd .enableAutoPlayVideo ();
/**
* 禁用视频自动播放功能
* 默认禁用
*/
VideoNativeAd videoNativeAd .disableAutoPlayVideo ();
自动播放控制逻辑:
**1.视图可见性定义:**视图处于 VISIBLE 状态且未被其他 view 覆盖,未处于锁屏、系统控制栏下拉、弹窗状态下。
2.当包含了播放器视图(MediaView)的页面布局创建完成或是被动态添加到页面布局中时,视图处于可见状态时开始自动播放。
3.对于ScrollView 、ListView 、RecyclerView 等滑动布局中,当播放器视图(MediaView)全部滑出屏幕完全不可见时视频自动暂停,视图滑入屏幕且可见区域占比为超高一半时开始自动播放。
加载多个视频信息流广告适合一次缓存多个广告的场景,适合在 ListView 或 RecyclerView 等列表式布局中使用。
SDK 内部完成了创建多个 VideoNativeAd 实例,分别进行广告请求,存放在一个缓存队列中,开发者可以从队列中取出缓存的广告实例。开发者也也可以自行实现。
// 设置广告位 ID 和缓存广告队列的数量
VideoNativeAdsManager mNativeAdsManager = new VideoNativeAdsManager (adUnitId , 10 );
// 请求广告
mNativeAdsManager .loadAds (new VideoNativeAdsManager .LoadAdsListener () {
@ Override
public void onLoadedAds (String adUnitId , int failedCount ) {
// 请求完成的回调中会返回请求失败的数量
Log .e (TAG ,"onFailedAds count = " + failedCount );
}
});
// 请求成功后,获取缓存队列中的 VideoNativeAd 实例
VideoNativeAd videoNativeAd = mNativeAdsManager .nextCacheAd ();
// 判断广告素材资源的可用性
videoNativeAd .isReady ();
// 检查广告是否过期
videoNativeAd .checkAdIsExpire ();
...
// 退出时也可以释放缓存在队列中的广告实例
mNativeAdsManager .release ();
具体使用可参考 Samlpe 中的基于 RecyclerView 实现的代码示例。
设置视频广告在播放中是否可关闭
VideoAdService .setCloseVideoEnable (boolean closeEnable );
用于控制视频播放界面左上脚关闭按钮是否展示的开关,用户可以在播放中点击关闭按钮关闭广告。
创建视频广告组件
/**
* 创建一个全屏模式视频广告组件
* @param activity 视频 activity
* @param adUnitID 视频广告位id
* @return FullScreenVideoAd 全屏模式视频广告组件
*/
VideoAdService .createFullModelVideoAd (Activity activity , String adUnitID );
/**
* 创建一个窗口模式视频广告组件
* @param activity 视频 activity
* @param adUnitID 视频广告位id
* @return WindowVideoAd 窗口模式视频广告组件
*/
VideoAdService .createWindowModelVideoAd (Activity activity , String adUnitID );
String adUnitId = "2-38-14" ;
WindowVideoAd windoeVideAd = VideoAdService .createWindowModelVideoAd (DemoActivity .this , adUnitId );
FullScreenVideoAd fullScreenVideoAd = VideoAdService .createFullModelVideoAd (DemoActivity .this , adUnitId );
注意:要区分全屏模式和窗口模式,对于创建的同一个VideoAd而言,只能支持一种模式下的视频播放!
设置广告监听器
mFullScreenVideoAd .setVideoAdListener (videoAdListener );
mWindowVideoAd .setVideoAdListener (videoAdListener )
VideoAdListener videoAdListener = new VideoAdListener () {
@ Override
public void onLoadSuccess (VideoAd videoAd ) {
// 所有广告资源下载完
}
@ Override
public void onLoadFailed (VideoAd videoAd , int errorCode ) {
// 广告请求或资源下载失败时回调
}
@ Override
public void onVideoAdFinished (VideoAd videoAd , int code ) {
// 广告显示结束后会回调,窗口视频会移除视频组件
if (videoAd instanceof WindowVideoAd ){
}
}
@ Override
public void onPlayError (VideoAd videoAd , int errorCode ) {
// 广告显示失败后会回调
}
@ Override
public void onReadyPlay (VideoAd videoAd ){
// 播放ui组件创建完成回调,用于管理多个窗口视频的自动播放时机
if (videoAd instanceof WindowVideoAd ){
videoAd .playAlreadyPreparedVideo ();
}
Toast .makeText (this , "视频准备好播放" , Toast .LENGTH_SHORT ).show ();
}
@ Override
public void onClickAd (int code ) {
// 广告被点击时回调
}
}
视频广告请求和资源下载
mWindowVideoAd.loadAd();
mFullScreenVideoAd.loadAd();
广告预加载包括预先请求广告和广告资源下载
视频广告展示(建议在广告监听器的回调中调用)
展示广告与请求广告进行了分步处理,可预先请求,需要时展示。
如果不等加载完成直接调用展示方法则会在播放器中 loading 等待广告资源加载完成后播放。
if (mWindowVideoAd != null || mWindowVideoAd .isReady ()){
mWindowVideoAd .showVideo (DemoActivity .this , mWindowVideoParent );
return ;
}
if (mFullScreenVideoAd != null || mFullScreenVideoAd .isReady ()){
FullScreenVideoAd .showVideo (DemoActivity .this );
return ;
}
@ Override
protected void onPause () {
super .onPause ();
if (mWindowVideoAd != null ){
mWindowVideoAd .onPause ();
}
}
@ Override
protected void onResume () {
super .onResume ();
if (mWindowVideoAd != null ){
mWindowVideoAd .onResume ();
}
}
隐藏视频贴片右上角倒计时:
InStreamAdService.hideTimeProgress();
隐藏视频贴片右下角“显示详情”按钮:
InStreamAdService.hideDetailBtn();
设置仅在Wifi环境下请求广告:
InStreamAdService.enableOnlyWifi();
注意:上述3个方法都要在实例化贴片广告之前调用。
创建视频贴片广告:
/**
* 创建一个贴片广告
* @param activity
* @param adUnitId 广告位Id
* @return
*/
InStreamAdService .createInStreamAd (Activity activity , String adUnitId );
加载贴片广告:
mAd.loadAd();
贴片广告使用使用示例代码:
//请求加载一个贴片广告,需要开发者在合适的时机调用
private void loadAd (){
mAd = InStreamAdService .createInStreamAd (this , "1-78-93" );
//给贴片广告添加监听
mAd .setAdListener (new InStreamAdListener () {
@ Override
public void onLoadedSuccess () {
//广告加载成功,展示到界面上
//开发者也可以自行决定把广告展示出来的时机
showAd ();
}
@ Override
public void onLoadFailed (int errorCode ) {
//广告加载失败,开发者可以在此处进行自己的处理
}
@ Override
public void onAdClick () {
//贴片广告被点击
}
@ Override
public void onAdFinished () {
//广告播放完成,开发者可以在此处进行自己的处理
}
@ Override
public void onAdError (int errorCode ) {
//广告播放错误,开发者可以在此处进行自己的处理
}
});
mAd .loadAd ();
}
//展示广告
private void showAd (){
if (mAd == null ){
Log .i (TAG , "贴片广告未请求" );
}else {
mAd .showAd (this , mAdLayout );
}
}
@ Override
protected void onResume () {
super .onResume ();
if (mAd != null ){
mAd .onResume ();
}
}
@ Override
protected void onPause () {
super .onPause ();
if (mAd != null ){
mAd .onPause ();
}
}
@ Override
protected void onDestroy () {
super .onDestroy ();
if (mAd != null ){
mAd .onDestroy ();
mAd = null ;
}
}
注意:
a) 一个贴片广告只能使用一次,无法复用,如果需要再展示一个贴片广告,需要重新实例化一个 贴片广告;
b) 开发者需要在Activity
的onResume()
、onPause()
、onDestroy()
3个方法中分别调用InStreamAd
的onResume()
、onPause()
、onDestroy()
。
广告请求错误码
数值
含义
SDKCode.CODE_UNKNOWN_ERROR
-1
异步请求过程中发生错误
SDKCode.CODE_HTTP_ERROR
1
处理http请求的过程中发生错误
SDKCode.CODE_PRELOAD_FIALED
2
广告资源加载失败
SDKCode.CODE_BAD_NETWORK
0
无网络或无网络权限
SDKCode.CODE_BLANK_RESPONSE
201
竞价请求失败,返回留白
SDKCode.CODE_BACK_AMOUNT
202
竞价请求失败,返回返量
下面是针对视频广告相关的状态码
播放状态返回码
数值
含义
VideoAdService.PLAYDONE
200
播放完视频后用户点击了返回
MVideoAdService.INSTALL_APK_DONE
201
安装了推广的app后返回
VideoAdService.PLAYDONE_SKIPVIDEO
202
用户跳过了广告视频
VideoAdService.LAUNCH_APP
203
用户点击广告打开了推广的app后返回
VideoAdService.OPEN_WEB
206
用户点击广告打开了推广落地页
VideoAdService.PLAYDONE_CLOSEDETAIL
208
用户看完视频后在推广详情页面点击关闭视频
VideoAdService.CLICK_DOWNLOAD
209
用户点击下载推广app
VideoAdService.ERROR_NO_VIDEO
204
没有请求到广告内容
VideoAdService.ERROR_DOWNLOAD:
400
视频下载中遇到错误
VideoAdService.ERROR_PLAYING_VIDEO
401
播放中遇到错误
VideoAdService.ERROR_CLOSE_VIDEO
402
点击关闭结束了视播放了
VideoAdService.ERROR_AUTO_PLAY
403
自动播放失败
VideoAdService.ERROR_MANUAL_DOWNLOAD:
404
手动请求下载广告资源失败
十二、适配Android7.0(如果不需要支持可直接跳过本段)
如果App需要支持Android7.0以上的设备,sdk提供了Android7.0多窗口模式和文件共享等相关特性的支持。
1、Activity分屏适配
Manifest中注册SplashActivity时候,需要加上android:resizeableActivity="false"
2、文件共享
a) 在7.0中下载安装apk文件共享必须使用FileProvider,所以需要在AndroidManifest.xml配置如下代码:
<!-- 配置provider用于适配7.0, authorities的{{com.sunteng.ads.sample}}部分替换成当前应用包名,
authorities = "{{BuildConfig.APPLICATION_ID}}.fileProvider" ,
provider_paths为创建在xml文件夹内的资源文件 -->
<provider
android : name =" android.support.v4.content.FileProvider"
android : authorities =" com.sunteng.ads.sample.fileProvider"
android : exported =" false"
android : grantUriPermissions =" true" >
<meta-data
android : name =" android.support.FILE_PROVIDER_PATHS"
android : resource =" @xml/provider_paths" />
</provider >
注意:如果你的项目之前已经在AndroidManifest.xml配置过FileProvider,sdk的AdService类提供了在代码中统一配置FileProvider的接口设置authorities:
public static void setFileProviderAuthorities (String authorities );
b) 可以看到在meta-data中,定义了一个资源路径,第二步就是创建res/xml/provider_paths.xml文件:
注意:只需把path中{{com.sunteng.ads.sample}}部分替换成你当前项目的包名,复制到文件中即可。
<?xml version =" 1.0" encoding =" utf-8" ?>
<paths xmlns : android =" http://schemas.android.com/apk/res/android" >
<!-- /storage/emulated/0/Android/com.sunteng.ads.sample/files/APK/-->
<!-- 把path中{{com.sunteng.ads.sample}}部分替换成项目的包名!-->
<external-path name =" sunteng_sdk_download_apk" path =" Android/data/com.sunteng.ads.sample/files/APK/" />
</paths >
在 Android 8.0 中,新增了安装未知应用权限,此权限与其他运行时权限一样,会与应用绑定。系统会在应用安装其他未知应用时进行提示,确保用户授予该权限后才会进行应用安装。如果您的应用使用了 26 或更高级别的 targetSdkLevel,建议在 AndroidManifest.xml 文件添加下面的权限声明:
<uses-permission android : name =" android.permission.REQUEST_INSTALL_PACKAGES" />
更多相关信息可参见谷歌官方说明:在 Android O 中更安全地获取应用
AdService.setIsDebugModel(boolean debug);
传入参数为true时,为debug模式,有日志输出,默认值为true。发布正式版本时候请关闭debug模式。
注意: SDK 支持的系统版本 API 需大于 14,因此需要在 AndroidManifest.xml 文件中指定了 android:targetSdkVersion>=14。如果需要兼容 Android 7.0 以上平台,请务必参照上面所述的 7.0 适配指导要求。
混淆要求: 请在打包 apk 在混淆文件中加入如下混淆规则配置:
-keep class com.sunteng.** { *; }
-keep interface com.sunteng.** { *; }
-dontwarn com.sunteng.**
AdService.setLocationEnable(boolean enable);
传入参数为 true 时,获取用户当前地理位置,默认值为 true 。
AdServices.releaseAllAdResource();
广告每次请求加载会产生一定量的资源缓存文件,开发者可以在闲时进行统一清理缓存(比如程序退出时,每次广告服务初始化前等),应避免在有广告展现的情况下清除资源。