如何在非Activity类中展示插屏广告?(CustomBinding类场景)
在非Activity的CustomBinding类中实现插屏广告展示
首先得明确:CustomBinding是基于DataBinding的工具类,它的@BindingAdapter方法是静态的,本身没有持有Context和生命周期,所以要实现插屏广告,我们需要解决Context获取和广告生命周期管理这两个核心问题,同时还要结合你原本的点击设壁纸逻辑。
下面是具体的实现步骤和代码示例:
1. 调整BindingAdapter参数,支持广告逻辑嵌入
我们需要给@BindingAdapter补充必要的参数,确保能拿到有效Context,同时把点击事件与广告展示、壁纸设置逻辑结合起来:
package com.annasblackhat.materiallivewallpaper.util; import android.content.Context; import android.databinding.BindingAdapter; import android.net.Uri; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.InterstitialAd; import com.google.android.gms.ads.AdListener; public class CustomBinding { // 插屏广告实例(建议在主Activity提前初始化,这里为演示简化处理) private static InterstitialAd mInterstitialAd; @BindingAdapter(value = {"imgAsset", "adContext"}, requireAll = true) public static void loadAssetImage(ImageView imageView, String assetPath, Context context) { // 原有加载asset图片的逻辑 Uri uri = Uri.parse("file:///android_asset/" + assetPath); Glide.with(imageView.getContext()) .load(uri) .into(imageView); // 初始化插屏广告(推荐移到Activity的onCreate中提前预加载) if (mInterstitialAd == null) { mInterstitialAd = new InterstitialAd(context); mInterstitialAd.setAdUnitId("你的插屏广告ID"); // 替换为你的实际广告ID mInterstitialAd.loadAd(new AdRequest.Builder().build()); } // 设置ImageView点击监听:先展示广告,广告关闭后执行设壁纸逻辑 imageView.setOnClickListener(v -> { if (mInterstitialAd != null && mInterstitialAd.isLoaded()) { mInterstitialAd.show(); // 广告关闭后的回调:重新加载广告+执行设壁纸 mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdClosed() { super.onAdClosed(); // 预加载下一次的广告 mInterstitialAd.loadAd(new AdRequest.Builder().build()); // 执行原本的设置壁纸逻辑 applyWallpaper(imageView, context); } }); } else { // 广告未加载完成,直接执行设壁纸 applyWallpaper(imageView, context); } }); } // 抽离设置壁纸的逻辑,保持代码整洁 private static void applyWallpaper(ImageView imageView, Context context) { // 这里放入你原本的设置壁纸代码,例如: // Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); // WallpaperManager.getInstance(context).setBitmap(bitmap); } }
2. 在布局文件中绑定参数
在主Activity对应的布局里,给ImageView添加Binding参数,传递图片路径和Context:
<ImageView android:layout_width="match_parent" android:layout_height="match_parent" app:imgAsset="@{`your_image_name.png`}" app:adContext="@{this}" /> <!-- `this` 指代主Activity的Context -->
3. 关键注意事项
- 广告预加载优化:插屏广告的初始化和预加载建议放在主Activity的
onCreate方法中,而不是每次加载图片时重复初始化,这样能避免广告加载延迟,提升用户体验。 - 内存泄漏规避:如果需要持有Context,尽量使用
context.getApplicationContext(),避免静态方法持有Activity的强引用导致内存泄漏。 - 异常场景处理:记得在
AdListener的onAdFailedToLoad回调中添加重试逻辑,或者直接执行设壁纸操作,避免用户点击后无响应。
内容的提问来源于stack exchange,提问作者Ilias Rami
相关产品推荐
相关产品推荐

