如何将插屏、横幅广告统一集成到单个Java类,替代多Activity重复集成
统一集成Android广告逻辑的实现方案
完全可以将所有广告(插屏、横幅)的集成逻辑统一到单个工具类中,通过单例模式+回调接口的方式,避免在每个Activity中重复编写相同代码,同时降低应用体积、提升维护效率。
一、创建全局广告管理类(AdManager)
这个类负责统一处理插屏广告的加载、展示,横幅广告的初始化与绑定,以及广告事件的回调分发。
public class AdManager { private static AdManager instance; private InterstitialAd mInterstitialAd; private AdRequest adRequest; // 插屏广告回调接口,用于通知宿主页面广告事件结果 public interface InterstitialAdCallback { void onAdDismissed(); // 广告关闭 void onAdFailed(); // 广告加载/展示失败 } private AdManager() { adRequest = new AdRequest.Builder().build(); } public static synchronized AdManager getInstance() { if (instance == null) { instance = new AdManager(); } return instance; } // 预加载插屏广告(建议在Application或启动页调用) public void preloadInterstitialAd(Context context, String adUnitId) { InterstitialAd.load(context, adUnitId, adRequest, new InterstitialAdLoadCallback() { @Override public void onAdLoaded(@NonNull InterstitialAd interstitialAd) { mInterstitialAd = interstitialAd; } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { mInterstitialAd = null; } }); } // 展示插屏广告 public void showInterstitialAd(Activity activity, InterstitialAdCallback callback) { if (mInterstitialAd != null) { mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { mInterstitialAd = null; if (callback != null) { callback.onAdDismissed(); } } @Override public void onAdFailedToShowFullScreenContent(@NonNull AdError adError) { mInterstitialAd = null; if (callback != null) { callback.onAdFailed(); } } }); mInterstitialAd.show(activity); } else { // 无可用广告,直接回调失败 if (callback != null) { callback.onAdFailed(); } } } // 加载并绑定横幅广告到指定容器 public void loadBannerAd(Context context, ViewGroup container, String adUnitId) { BannerAd bannerAd = new BannerAd(context); bannerAd.setAdUnitId(adUnitId); bannerAd.setAdSize(AdSize.BANNER); container.addView(bannerAd); bannerAd.loadAd(adRequest); } }
二、在Activity中简化调用
以你的TradingStyle Activity为例,改造后无需重复编写广告加载与回调逻辑,只需调用AdManager的方法并处理回调:
public class TradingStyle extends AppCompatActivity { Button button2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_trading_style); button2 = findViewById(R.id.button2); button2.setOnClickListener(view -> { final ProgressDialog pd = new ProgressDialog(this); pd.setCancelable(false); pd.setMessage("Loading..."); pd.show(); // 预加载插屏广告(若未提前加载) AdManager.getInstance().preloadInterstitialAd(this, getString(R.string.main_inter)); // 实际开发建议监听广告加载状态,此处用延迟模拟等待加载完成 new Handler(Looper.getMainLooper()).postDelayed(() -> { pd.dismiss(); AdManager.getInstance().showInterstitialAd(this, new AdManager.InterstitialAdCallback() { @Override public void onAdDismissed() { startActivity(new Intent(TradingStyle.this, TradingStyleMenu.class)); } @Override public void onAdFailed() { startActivity(new Intent(TradingStyle.this, TradingStyleMenu.class)); } }); }, 1000); }); // 预加载返回时的插屏广告 AdManager.getInstance().preloadInterstitialAd(this, getString(R.string.main_inter)); } @Override public void onBackPressed() { AdManager.getInstance().showInterstitialAd(this, new AdManager.InterstitialAdCallback() { @Override public void onAdDismissed() { finish(); } @Override public void onAdFailed() { finish(); } }); } // 原有菜单、跳转逻辑保持不变 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; } @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { int id = item.getItemId(); if (id == R.id.rate) { Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse("https://play.google.com/store/apps/details?id=com.trade.earneasily")); startActivity(i); } return super.onOptionsItemSelected(item); } }
三、优化建议
- 预加载策略:在
Application的onCreate方法中提前预加载常用插屏广告,避免用户点击时等待加载,提升体验。 - 内存泄漏防护:展示广告时传入的
Activity上下文无需长期持有,广告关闭后及时释放引用(如示例中mInterstitialAd = null)。 - 横幅广告复用:如果多个页面需要相同样式的横幅广告,可在
AdManager中封装通用初始化逻辑,直接绑定到页面容器即可。 - 统一错误处理:在
AdManager中集中处理广告加载失败的逻辑(如日志上报),无需每个页面重复处理。
内容的提问来源于stack exchange,提问作者user20642163
相关产品推荐
相关产品推荐

