android App一段时间没有操作或没有点击屏幕后弹出广告,或者一段时间没有点击屏幕进行特定操作。 定时任务

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;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值