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(); @Override
第二步:设置定时广告
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; } }