- 首先我们需要添加一个全局的Application
public class MyApp extends LitePalApplication {private static final String TAG = "MyApp";private static Context mContext;private boolean isManageMent;public static String oaid;@Overridepublic void onCreate() {super.onCreate();mContext = getApplicationContext();isManageMent = RXSPTool.getBoolean(this, Constant.SP_MANAGEMENT);AppFrontBackHelper.register(MyApp.this, new AppFrontBackHelper.OnAppStatusListener() {@Overridepublic 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();}}@Overridepublic void onBack() {//应用切到后台处理if (isManageMent) {//停止计时GlobalAdsTimer.getInstance().stop();}}});}public static Context getContext() {return mContext;}}
需在AndroidManifest中添加
- 需添加一个应用前后台状态监听帮助类,仅在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;@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {ActivityManager.setCurrentActivity(activity);}@Overridepublic void onActivityStarted(Activity activity) {ActivityManager.setCurrentActivity(activity);activityStartCount++;//数值从0变到1说明是从后台切到前台if (activityStartCount == 1){//从后台切到前台if(mOnAppStatusListener != null){mOnAppStatusListener.onFront(activity);}}}@Overridepublic void onActivityResumed(Activity activity) {ActivityManager.setCurrentActivity(activity);}@Overridepublic void onActivityPaused(Activity activity) {ActivityManager.setCurrentActivity(activity);}@Overridepublic void onActivityStopped(Activity activity) {ActivityManager.setCurrentActivity(activity);activityStartCount--;//数值从1到0说明是从前台切到后台if (activityStartCount == 0){//从前台切到后台if(mOnAppStatusListener != null){mOnAppStatusListener.onBack();}}}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}};public interface OnAppStatusListener{void onFront(Activity activity);void onBack();}}
- 创建一个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() {@Overridepublic 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();