Android如何实现一个应用位于前台时全局页面每隔三分钟弹出一次一天最多弹出5次的GroMore半插屏广告,处于付费页和后台时停止

  1. 首先我们需要添加一个全局的Application
public class MyApp extends LitePalApplication {

    private static final String TAG = "MyApp";

    private static Context mContext;

    private boolean isManageMent;

    public static String oaid;

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
        isManageMent = RXSPTool.getBoolean(this, Constant.SP_MANAGEMENT);
        AppFrontBackHelper.register(MyApp.this, new AppFrontBackHelper.OnAppStatusListener() {
            @Override
            public void onFront(Activity activity) {
                isManageMent = RXSPTool.getBoolean(activity, Constant.SP_MANAGEMENT);
                //应用切到前台处理
                if (isManageMent) {
                    EventStorage.sendPRE_START(activity, "1");
                    if (!RXSPTool.getBoolean(mContext, "hadColdLaunch")) {
                        //热启动开屏广告
                        Intent intent = new Intent(mContext, MediationSplashActivity.class);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                    }
                    //开始计时
                    GlobalAdsTimer.getInstance().showScreenAds();
                }
            }

            @Override
            public void onBack() {
                //应用切到后台处理
                if (isManageMent) {
                    //停止计时
                    GlobalAdsTimer.getInstance().stop();
                }
            }
        });
    }

    public static Context getContext() {
        return mContext;
    }
    
}

需在AndroidManifest中添加在这里插入图片描述

  1. 需添加一个应用前后台状态监听帮助类,仅在Application中使用
public class AppFrontBackHelper {

    private static OnAppStatusListener mOnAppStatusListener;


    public AppFrontBackHelper() {

    }

    /**
     * 注册状态监听,仅在Application中使用
     * @param application
     * @param listener
     */
    public static void register(Application application, OnAppStatusListener listener){
        mOnAppStatusListener = listener;
        application.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
    }

    public void unRegister(Application application){
        application.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);
    }

    private static Application.ActivityLifecycleCallbacks activityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {
        //打开的Activity数量统计
        private int activityStartCount = 0;

        @Override
        public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
            ActivityManager.setCurrentActivity(activity);
        }

        @Override
        public void onActivityStarted(Activity activity) {
            ActivityManager.setCurrentActivity(activity);
            activityStartCount++;
            //数值从0变到1说明是从后台切到前台
            if (activityStartCount == 1){
                //从后台切到前台
                if(mOnAppStatusListener != null){
                    mOnAppStatusListener.onFront(activity);
                }
            }
        }

        @Override
        public void onActivityResumed(Activity activity) {
            ActivityManager.setCurrentActivity(activity);

        }

        @Override
        public void onActivityPaused(Activity activity) {
            ActivityManager.setCurrentActivity(activity);
        }

        @Override
        public void onActivityStopped(Activity activity) {
            ActivityManager.setCurrentActivity(activity);
            activityStartCount--;
            //数值从1到0说明是从前台切到后台
            if (activityStartCount == 0){
                //从前台切到后台
                if(mOnAppStatusListener != null){
                    mOnAppStatusListener.onBack();
                }
            }
        }

        @Override
        public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
           
        }

        @Override
        public void onActivityDestroyed(Activity activity) {
           
        }
    };

    public interface OnAppStatusListener{
        void onFront(Activity activity);
        void onBack();
    }

}

  1. 创建一个Activity管理类,通过在Application监听所有Activity的生命周期回调来获取当前显示的Activity
public class ActivityManager {
    // 弱引用
    private static WeakReference<Activity> sCurrentActivityWeakRef;

    public static Activity getCurrentActivity() {
        if (sCurrentActivityWeakRef != null) {
            return sCurrentActivityWeakRef.get();
        }
        return null;
    }

    public static void setCurrentActivity(Activity activity) {
        sCurrentActivityWeakRef = new WeakReference<>(activity);
    }
}

在 AppFrontBackHelper中保存ActivityManager.setCurrentActivity(activity);
4.处理计时相关的逻辑在GlobalAdsTimer中

public class GlobalAdsTimer {
    private static GlobalAdsTimer instance;
    private final Handler handler = new Handler(Looper.getMainLooper());
    private Runnable timerHalfScreenRunnable;
    private  int showTodayHalfScreenNumVideo;

    private static final String TAG = "GlobalAdsTimer";

    private GlobalAdsTimer() {
        // 私有构造函数
    }

    public static synchronized GlobalAdsTimer getInstance() {
        if (instance == null) {
            instance = new GlobalAdsTimer();
        }
        return instance;
    }

    // 展示广告
    private void start(Activity context) {
        stop(); // 取消之前的定时器任务
        timerHalfScreenRunnable = new Runnable() {
            @Override
            public void run() {
                String nowDataString = DateUtils.getNowDataString();
                RXSPTool.putString(context, "showTodayHalfScreenVideo", nowDataString);
                int num = showTodayHalfScreenNumVideo += 1;
                RXSPTool.putInt(context, "showTodayHalfScreenNumVideo", num);
                //展示插屏广告  
                TTAdvManagerControl.getInstance().globalInterstitialAdVideo(
                        context
                        , () -> showScreenAds()//当用户手动关闭了广告后再请求下一次
                        , () -> {
                        });
            }
        };
        handler.postDelayed(timerHalfScreenRunnable, 3 * 60 * 1000); // 3分钟
        //handler.postDelayed(timerHalfScreenRunnable, 15000); //用于测试 15s
    }

    // 展示条件
    public void showScreenAds() {
        Activity context = ActivityManager.getCurrentActivity();
        boolean showInterstitialAd = TTAdvManagerControl.getInstance().isShowInterstitialAd();
        if (showInterstitialAd) {
            String showTodayHalfScreenVideo = RXSPTool.getString(context, "showTodayHalfScreenVideo");
            String nowDataString = DateUtils.getNowDataString();
            if (!showTodayHalfScreenVideo.equals(nowDataString)) {
                RXSPTool.putInt(context, "showTodayHalfScreenNumVideo", 0);
            }
            int showTodayHalfScreenNumVideo = RXSPTool.getInt(context, "showTodayHalfScreenNumVideo");
            if (showTodayHalfScreenNumVideo < 5) {
                start(context);
            } else {
                stop();
            }
        }
    }

    // 停止广告
    public void stop() {
        if (null != timerHalfScreenRunnable) {
            handler.removeCallbacks(timerHalfScreenRunnable);
            timerHalfScreenRunnable = null;
        }
    }
}

5.在特殊页面进入不需要展示广告

 //则页面跳转时 停止计时
 GlobalAdsTimer.getInstance().stop();
 // 页面onDestroy()时 重新开始计时
 GlobalAdsTimer.getInstance().showScreenAds();

最近更新

  1. TCP协议是安全的吗?

    2024-04-11 18:32:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-11 18:32:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-11 18:32:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-11 18:32:02       20 阅读

热门阅读

  1. CSP 比赛经验分享

    2024-04-11 18:32:02       11 阅读
  2. 5.2 SSH和交换机端口安全概述

    2024-04-11 18:32:02       11 阅读
  3. FineBI概述

    2024-04-11 18:32:02       15 阅读
  4. FineBI概述

    2024-04-11 18:32:02       14 阅读
  5. FineBI概述

    2024-04-11 18:32:02       15 阅读
  6. 002 spring ioc(注解)

    2024-04-11 18:32:02       13 阅读
  7. 基于springboot的大创管理系统源码数据库

    2024-04-11 18:32:02       17 阅读
  8. 数据结构5:哈希表

    2024-04-11 18:32:02       13 阅读
  9. 聊聊Redis消息队列stream

    2024-04-11 18:32:02       15 阅读
  10. python爱心代码高级

    2024-04-11 18:32:02       12 阅读
  11. 面试经典150题——移除元素

    2024-04-11 18:32:02       15 阅读
  12. LeetCode -- 第 392 场周赛

    2024-04-11 18:32:02       18 阅读