此需求主要注意以下几点:
1、前后台切换监听
解决方案:在BaseApplication中通过
registerActivityLifecycleCallbacks(new LifecycleHandler());
来监听前后台的切换。
2、从任何页面切换到后台再切回到前台都可以展示广告页
解决方案:在BaseAvtivity的onStart()方法里通过
getWindowManager().addView(mAdView, params);
来添加广告页。
3、一定时间段内前后台切换不要出现广告页
解决方案:通过记录上次开屏广告的时间与当前时间的差值来判断是否显示广告。
System.currentTimeMillis() - mLastADTime > mADInterval;
4、广告页面倒计时n秒后消失
解决方案:利用CountDownTimer来进行倒计时。
Show u my code
Step1:BaseApplication
public class DemoBaseApplication extends MultiDexApplication {
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(new LifecycleHandler());
}
.....
}
class LifecycleHandler implements Application.ActivityLifecycleCallbacks {
public static final int STATE_NORMAL = 0;
public static final int STATE_BACK_TO_FRONT = 1;
public static final int STATE_FRONT_TO_BACK = 2;
public static int sAppState = STATE_NORMAL;
private int mVisibleActivityCount = 0;
@Override
public void onActivityStarted(Activity activity) {
// 每有一个activity可见都会走该方法,mVisibleActivityCount会增1。
mVisibleActivityCount++;
if (mVisibleActivityCount == 1) {
// 从后台进入前台
sAppState = STATE_BACK_TO_FRONT;
} else {
// 否则是正常状态
sAppState = STATE_NORMAL;
}
}
@Override
public void onActivityStopped(Activity activity) {
//每有一个acitivity不可见都会走该方法,让mVisibleActivityCount减1。
mVisibleActivityCount--;
if (mVisibleActivityCount == 0) {
// 从前台进入后台
sAppState = STATE_FRONT_TO_BACK;
} else {
// 否则是正常状态
sAppState = STATE_NORMAL;
}
}
.....
}
Step2: BaseActivity
public abstract class DemoBaseActivity extends AppCompatActivity{
// 广告显示时间
private long mADDuration = 1000 * 4;
// 广告显示间隔时间, 间隔内不出现广告
private long mADInterval = 1000 * 20;
// 上次显示广告的时间
private long mLastADTime = 0;
//广告页的view
private View mAdView;
private ImageView mIvAd;
private TextView mTvTimer;
private CountDownTimer mTimer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initAdView();
}
private void initAdView() {
mAdView = View.inflate(this, R.layout.activity_base_ad_view, null);
mIvAd = (ImageView) mAdView.findViewById(R.id.iv_ad);
mTvTimer = (TextView) mAdView.findViewById(R.id.tv_timer);
mTimer = new CountDownTimer(mADDuration, 1000) {
@Override
public void onTick(long millisUntilFinished) {
String text = (millisUntilFinished / 1000) + "s";
mTvTimer.setText(text);
}
@Override
public void onFinish() {
if (mAdView != null) {
mTvTimer.setText("0s");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getWindowManager().removeViewImmediate(mAdView);
}
}, 100);
}
}
};
}
@Override
protected void onStart() {
super.onStart();
// 判断是否从后台恢复, 且时间间隔符合要求, 显示广告页面
boolean isFromBackToFront = LifecycleHandler.sAppState == LifecycleHandler.STATE_BACK_TO_FRONT;
if (isFromBackToFront && canShowAD()) {
showAD();
}
}
/**
* 显示广告
*/
private void showAD() {
// 显示广告页面
createADView();
// 随机显示一个广告页
showRandomAD();
// 开始倒计时
mTimer.cancel();
mTimer.start();
// 记录显示广告的时间, 以便后续比对
mLastADTime = System.currentTimeMillis();
}
/**
* 判断两次时间是否大于规定的间隔
*
* @return true大于间隔, 否则false
*/
private boolean canShowAD() {
return System.currentTimeMillis() - mLastADTime > mADInterval;
}
private void createADView() {
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.x = 0;
params.y = 0;
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = WindowManager.LayoutParams.MATCH_PARENT;
getWindowManager().addView(mAdView, params);
}
private void showRandomAD() {
switch (new Random().nextInt(3)) {
case 0:
mIvAd.setImageResource(R.drawable.no_data_remind);
break;
case 1:
mIvAd.setImageResource(R.drawable.no_data_remind);
break;
case 2:
mIvAd.setImageResource(R.drawable.no_data_remind);
break;
}
}
....
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/iv_ad"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/tv_timer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="time"
android:textSize="30sp" />
</RelativeLayout>