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

1,首先添加一个全局的生命周期监听类

class AppLifecycleObserver with WidgetsBindingObserver {

  bool IsCold = false;
  bool isAgree = false;
  void getIsCold() async {
    isAgree = await SPManager().getBool(SPKeys.isAgreePrivacy, defaultValue: true);
    IsCold = await SPManager().getBool("isCold", defaultValue: false);
  }

  Future<bool> getIsVipPay() async {
    return await SPManager().getBool('isVipPay', defaultValue: false);
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    getIsCold();
    if(!isAgree) {
      if (state == AppLifecycleState.resumed) {
        if (!IsCold) {
          //热启动开屏广告
          IdcardAndroid().showSplashAd(AdsConfig.splashId);
          SPManager().setBool("isCold", true);
        } else {
          SPManager().setBool("isCold", AdsConfig.isPayBack? true: false);
        }
        SPManager().getBool(SPKeys.isShowPayPage, defaultValue: false).then((value) => {
          if (value){
          //满足条件开始计时
            GlobalAdsTimer.showScreenAds()
          }
        });
      }
    }
    if (state == AppLifecycleState.paused){
    //退入后台时停止广告计时
      GlobalAdsTimer.stop();
    } else if (state == AppLifecycleState.detached) {
    }
  }

}

在main()入口绑定 就可以监测到了 全局的生命周期

`WidgetsBinding.instance.addObserver(AppLifecycleObserver());

2,定义一个全局的计时器 GlobalAdsTimer()

class GlobalAdsTimer {
  static Timer? timerHalfScreen;

  //展示广告
  static void start() {
    timerHalfScreen?.cancel();
    timerHalfScreen = null;
    timerHalfScreen = Timer.periodic(const Duration(minutes: 3), (timer) {
      showTodayHalfScreenVideo();
      setRealSystemUIOverlayStyle = true;
      addTodayHalfScreenNumVideo();
      timerHalfScreen?.cancel();
      timerHalfScreen = null;
      GroMoreManager().showInterstitialAd((b){
        //如果当前有前一个插屏广告未关闭就不继续请求
        if (b){
          showScreenAds();
        }
      });
    });
  }


  //展示条件
  static void showScreenAds() {
    print('GlobalAdsTimer_showScreenAds');
    GroMoreManager().isShowHomeInterstitialAd().then((value) => {
      if (value) {
        getShowTodayHalfScreenVideo().then((value) => {
          if (value) {
            clearTodayHalfScreenNumVideo(0),
          },
          getShowTodayHalfScreenNumVideo().then((int num) => {
            if (num < 5) {
              start(),
            } else {
              timerHalfScreen?.cancel(),
              timerHalfScreen = null,
            }
          })
        })
      }
    });
  }

  // 停止广告 应用退入后台/进入通用付费页/引导付费页 停止计时
  static void stop() {
    print('GlobalAdsTimer_stop');
    timerHalfScreen?.cancel();
  }

3,当进入特殊页面禁止弹出插屏广告,例如付费页禁止弹出影响用户付费率时
VipPage

 @override
  void initState() {
    super.initState();
    //停止计时
    GlobalAdsTimer.stop();  
  }

页面销毁时开始

 @override
  void dispose() {
    super.dispose();
    GlobalAdsTimer.showScreenAds();
  }

最近更新

  1. TCP协议是安全的吗?

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

    2024-04-13 09:46:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-13 09:46:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-13 09:46:03       20 阅读

热门阅读

  1. 针对“AI+医疗”的可行方案

    2024-04-13 09:46:03       22 阅读
  2. python抠图程序

    2024-04-13 09:46:03       16 阅读
  3. P8732 [蓝桥杯 2020 国 ABC] 答疑

    2024-04-13 09:46:03       11 阅读
  4. Wi-Fi信号的EVM指标分析

    2024-04-13 09:46:03       20 阅读
  5. 基于FFmpeg进行rtsp推流及拉流

    2024-04-13 09:46:03       53 阅读
  6. 5.118 BCC工具之xfsslower.py解读

    2024-04-13 09:46:03       55 阅读
  7. Docker Entrypoint和CMD同时使用的注意事项

    2024-04-13 09:46:03       14 阅读
  8. 神州数码交换机指令全集

    2024-04-13 09:46:03       17 阅读
  9. Docker 镜像 用普通用户启动服务

    2024-04-13 09:46:03       17 阅读
  10. 部署Nginx+keepalived+Tomcat集群架构

    2024-04-13 09:46:03       40 阅读
  11. 探索Python库的奇妙世界

    2024-04-13 09:46:03       14 阅读
  12. 常见通信方式之Websocket

    2024-04-13 09:46:03       21 阅读
  13. TS基础2-常用类型

    2024-04-13 09:46:03       19 阅读
  14. 【6】c++多线程技术之线程的参数传递

    2024-04-13 09:46:03       19 阅读