You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将插屏、横幅广告统一集成到单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:05:21