如何实现观看激励视频后当前会话移除广告 重启App后恢复展示
核心用进程内静态标记位实现会话级免广告控制,不需要做本地持久化,应用重启进程销毁后标记自动重置,刚好满足重启后广告恢复的需求,整体改造分4部分:
具体实现步骤
第一步:定义全局会话免广告标记
可以在自定义Application类中定义静态布尔变量,全局可访问,进程被杀后自动恢复默认值false,不需要额外写重置逻辑:public class MyApp extends Application { // 当前会话是否免广告,默认关闭,应用重启后自动重置 public static boolean isAdFreeForSession = false; }记得在
AndroidManifest.xml中配置自定义Application类。如果不想新增Application类,也可以直接在HomeActivity中定义同名静态变量,效果一致。注意不要把这个值存到SharedPreferences、数据库等持久化存储中,否则重启应用标记不会消失。第二步:改造广告初始化逻辑
原onCreate中直接加载Banner、插屏广告的逻辑,增加免广告状态判断,免广告状态下直接隐藏Banner、不加载任何广告:MobileAds.initialize(this, initializationStatus -> {}); AdView mAdView = findViewById(R.id.adView); if (MyApp.isAdFreeForSession) { mAdView.setVisibility(View.GONE); } else { mAdView.setVisibility(View.VISIBLE); AdRequest adRequest = new AdRequest.Builder().build(); mAdView.loadAd(adRequest); intertitalAd(); }第三步:改造插屏广告展示逻辑
现有copy()、share()方法中,所有触发插屏展示、预加载的位置都增加免广告判断,免广告状态下直接执行业务逻辑,不弹广告、不预加载新插屏。以copy()方法为例,改造后代码如下:private void copy() { // 免广告状态直接执行业务逻辑 if (MyApp.isAdFreeForSession) { startActivity(new Intent(HomeActivity.this, HomeActivity.class)); doCopyAction(); return; } if (mInterstitialAd != null) { mInterstitialAd.show(HomeActivity.this); mInterstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdDismissedFullScreenContent() { super.onAdDismissedFullScreenContent(); startActivity(new Intent(HomeActivity.this, HomeActivity.class)); mInterstitialAd = null; // 非免广告状态才预加载下一个插屏 if (!MyApp.isAdFreeForSession) { intertitalAd(); } doCopyAction(); } }); } else { startActivity(new Intent(HomeActivity.this, HomeActivity.class)); doCopyAction(); } } // 抽离复制业务逻辑,避免重复代码 private void doCopyAction() { ClipboardManager clipboardManager = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); ClipData clipData = ClipData.newPlainText("text", quotesTxt.getText()); if (clipboardManager != null) { clipboardManager.setPrimaryClip(clipData); } Toast.makeText(getApplicationContext(), "Copied", Toast.LENGTH_SHORT).show(); }share()方法按照相同逻辑改造即可,把分享业务逻辑抽离成独立方法,所有广告触发、预加载位置都增加免广告状态判断。第四步:接入激励视频广告,发放免广告权益
新增激励视频加载、展示逻辑,在你设置的「看视频免广告」入口(比如页面按钮、弹窗按钮)调用展示方法,必须等用户完整看完视频、触发奖励回调后再发放权益,避免用户跳过广告也拿到免广告资格违反平台政策:private RewardedAd mRewardedAd; // 页面初始化时可以提前加载激励视频 private void loadRewardedAd() { AdRequest adRequest = new AdRequest.Builder().build(); RewardedAd.load(this, "替换为你的激励视频广告位ID", adRequest, new RewardedAdLoadCallback() { @Override public void onAdLoaded(@NonNull RewardedAd rewardedAd) { mRewardedAd = rewardedAd; } @Override public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { mRewardedAd = null; } }); } // 点击免广告入口时调用该方法展示激励视频 private void showRewardedAd() { if (mRewardedAd == null) { Toast.makeText(this, "广告加载中,请稍后再试", Toast.LENGTH_SHORT).show(); loadRewardedAd(); return; } mRewardedAd.show(this, rewardItem -> { // 用户完整看完视频,发放当前会话免广告权益 MyApp.isAdFreeForSession = true; // 隐藏当前页Banner if (mAdView != null) { mAdView.setVisibility(View.GONE); } // 清空已加载的插屏,后续不再预加载 mInterstitialAd = null; Toast.makeText(HomeActivity.this, "已获得本次应用使用周期免广告权益", Toast.LENGTH_SHORT).show(); }); }
注意事项
- 如果应用包含多个Activity,每个Activity的广告加载、展示逻辑前都要判断全局免广告标记,避免其他页面漏出广告
- 激励视频的奖励发放逻辑必须写在
onUserEarnedReward回调中,用户提前关闭、跳过广告时不发放权益 - 不要手动做会话结束的重置逻辑,静态变量随应用进程销毁自动恢复默认值,完全匹配重启应用广告恢复的需求
内容的提问来源于stack exchange,提问作者user18105926

