android App没有操作一段时间后弹出屏保广告页面
最近做了个项目,里面有个功能是app在任何activity中没有操作一段时间后要跳转到屏保广告页面,点击广告页面是返回上一个activity中,并且广告页面是客户在后台设置的多张图片或者gif。也可以改成是app在没有一段时间没有点击屏幕后跳转到特定的界面等等,可以自己修改。
那么,来想想这功能的实现思路吧。首先,是全部activity都要有这功能,那就在一个BaseActivity里面实现该功能,然后其他Activity继承BaseActivity就可以了。
第一步 :app设置长亮,不可暗屏,抽象一个公共的方法给子类Activity设置layout。
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置屏幕长亮
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(getLayoutRes());
}
protected abstract int getLayoutRes();
第二步:设置定时广告
private long advertisingTime = 15 * 1000;//定时跳转广告时间
/**
* 跳轉廣告
*/
public void startAD() {
if (countDownTimer == null) {
countDownTimer = new CountDownTimer(advertisingTime, 1000l) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
//定时完成后的操作
}
};
countDownTimer.start();
} else {
countDownTimer.start();
}
}
第三步:设置屏幕点击监听;这一步要重写dispatchTouchEvent就好了,不要重写onTouchEvent。onTouchEvent自能监听到空白处的点击,其他控件或者是View的点击事件是监听不到的。不了解的可以看一下事件分发。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//有按下动作时取消定时
if (countDownTimer != null){
countDownTimer.cancel();
}
break;
case MotionEvent.ACTION_UP:
//抬起时启动定时
startAD();
break;
}
return super.dispatchTouchEvent(ev);
}
第四步:广告定时在activity启动或者是取消操作, CountDownTimer在Activity销毁或者是不在前台还是在运行的,所以要在Activity的生命周期中控制一下。
@Override
protected void onResume() {
super.onResume();
//显示是启动定时
startAD();
}
@Override
protected void onPause() {
super.onPause();
//当activity不在前台是停止定时
if (countDownTimer != null){
countDownTimer.cancel();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//销毁时停止定时
if (countDownTimer != null){
countDownTimer.cancel();
}
}
将代码贴出来,有什么不对的欢迎指出:
BaseActivity的代码:
package com.demo.myadvertising;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.WindowManager;
/**
* Author:
* Date: 2017/8/10
* Description:
*/
public abstract class BaseActivity extends AppCompatActivity {
public CountDownTimer countDownTimer;
private long advertisingTime = 15 * 1000;//定时跳转广告时间
public Context context;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置屏幕长亮
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
context = this;
setContentView(getLayoutRes());
}
protected abstract int getLayoutRes();
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
//有按下动作时取消定时
if (countDownTimer != null){
countDownTimer.cancel();
}
break;
case MotionEvent.ACTION_UP:
//抬起时启动定时
startAD();
break;
}
return super.dispatchTouchEvent(ev);
}
/**
* 跳轉廣告
*/
public void startAD() {
if (countDownTimer == null) {
countDownTimer = new CountDownTimer(advertisingTime, 1000l) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
//定时完成后的操作
//跳转到广告页面
startActivity(new Intent(context,ADActivity.class));
}
};
countDownTimer.start();
} else {
countDownTimer.start();
}
}
@Override
protected void onResume() {
super.onResume();
//显示是启动定时
startAD();
}
@Override
protected void onPause() {
super.onPause();
//当activity不在前台是停止定时
if (countDownTimer != null){
countDownTimer.cancel();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//销毁时停止定时
if (countDownTimer != null){
countDownTimer.cancel();
}
}
}
其他Activity继承BaseActivity就可以实现功能,例如MainActivity:
package com.demo.myadvertising;
import android.os.Bundle;
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
protected int getLayoutRes() {
return R.layout.activity_main;
}
}