- 首先我们需要添加一个全局的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中添加
- 需添加一个应用前后台状态监听帮助类,仅在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();
}
}
- 创建一个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();