Android监测用户行为,未操作定时执行事件

本文介绍了如何在Android应用中监测用户行为,当用户一段时间无操作时,通过`onUserInteraction()`结合`CountDownTimer`自动触发特定事件。通过创建一个Activity基类并实现倒计时逻辑,实现全应用范围的用户无操作监测功能。

前言

这是小弟第一次写博客,旨在记录自己的IT学习之路,总结编程开发知识,与更多朋友分享交流学习。若有不足,请多指教。
在我们实际Android开发中,有时候会有“用户一段时间不操作程序,执行某些事件”的需求,正好现在公司项目实现了这个需求,特地写了这篇博客记录。

运行效果

这里写图片描述

声明一下,重新开始计时不是通过右下角的按钮控制的,是通过Activity的onUserInteraction() + CountDownTimer控制的。右下角的按钮仅仅用做Toast。

代码实现

Activity的onUserInteraction()方法

Android对用户操作在Activity提供了一个回调onUserInteraction();顾名思义,这个方法在用户交互(触摸屏幕)的时候的回调。

CountDownTimer

在Android开发过程中,常常会有类似“60秒重新获得验证码”的倒计时需求,Android为我们提供了CountDownTimer类,就是封装了倒计时功能。

编写Activity基类

为了实现对整个应用的监测用户行为,必须编写一个Activity基类,项目所有的Activity均继承于这个Activity。

/**
 * @Author lankang
 * @Date 16/5/25
 */
public class BaseActivity extends AppCompatActivity {

    //倒计时总时间
    public static final long COUNTDOWN_TIME = 10000;

    @Override
    public void onUserInteraction() {
        MyTimer timer =
                MyTimer.getInstance(COUNTDOWN_TIME,1000,this);
        //先取消
        timer.cancel();
        MainActivity.textView.setText("倒计时:10秒,弹出提示框");
        //再开始
        timer.start();
        super.onUserInteraction();
    }
}

可以看出,核心功能在自定义的MyTimer类,其代码如下:

/**
 * @Author lankang
 * @Date 16/5/25
 */
public class MyTimer extends CountDownTimer{

    public static MyTimer mInstance;

    private Context context;

    private long millisInFuture;

    /**
     * @param millisInFuture  总时长
     * @param countDownInterval 多少时间执行一次onTick
     * @param context
     * @return
     */
    public static MyTimer getInstance(long millisInFuture, long countDownInterval,Context context){
        //单例
        if (mInstance == null){
            synchronized (MyTimer.class){
                if (mInstance == null) {
                    mInstance =
                            new MyTimer(millisInFuture,countDownInterval,context);
                }
            }
        }
        return mInstance;

    }

    private MyTimer(long millisInFuture, long countDownInterval,Context context) {
        super(millisInFuture, countDownInterval);
        this.context = context;
        this.millisInFuture = millisInFuture;

    }

    @Override
    public void onTick(long time) {
        //TODO 每隔countDownInterval执行
        //demo这里仅做提示
        MainActivity.textView.setText
                ("倒计时:" + ((time/1000) + 1) + "秒,弹出提示框");
    }

    @Override
    public void onFinish() {
        //TODO 计时完成
        MainActivity.textView.setText("倒计时:1秒,弹出提示框");
        String time = String.valueOf(millisInFuture/1000);
        AlertDialog.Builder builder =
                new AlertDialog.Builder(context);
        builder.setTitle("提示")
                .setMessage(time + "秒未操作程序。")
                .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                })
                .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        dialogInterface.dismiss();
                    }
                })
                .create().show();
    }
}

必须保证MyTimer的单例,否则将会直接使倒计时不准确或者出现其他bug,双层的null判断加上synchronized线程锁就是保证MyTimer的单例。
cancel()和start()分别是取消倒计时和开始倒计时。
MyTimer继承于CountDownTimer,实现它的两个抽象方法onTick()和
onFinish(),onTick()在每隔一段时间(由构造参数 long countDownInterval决定)执行,onFinish()在倒计时结束后执行。
在这里,我在倒计时完成后,执行一个dialog提示。

其他Activity

编写好BaseActivity和计时器MyTimer,只要将Activity继承与BaseActivity就能实现前面所说需求了。

public class MainActivity extends BaseActivity {

    //static 可以忽略,只是方便demo提示
    public static TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

       FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        textView = (TextView) findViewById(R.id.tv);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this,"重新计时!",Toast.LENGTH_SHORT).show();
            }
        });
    }
    }

总结

第一次博客完成了,虽然是个小技术,也希望是个好的开始,对各位朋友有所帮助。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值