Android进阶之路 - 长时间未操作屏幕唤出屏保

业务需求来源于售货机项目,虽然最终这个项目没有实施,但是这个功能确实很常用,考虑到在Android中我还没做过这个功能,故此找到实现方式后记录于此 ~

最初接到此需求的时候,我只考虑到了定时器,远远没有全面思考,一些场景根本就没有考虑到,索性互联网的开放精神,让我学习到了更多的思考方向 !

后来的后来,我补全了一个售货机常用的 商品轮播展示功能 ~

Effect

这里我直接通过了log查看了需求实现效果,表示使用的话没有什么问题
在这里插入图片描述

思考方式
问题

1.如何监听用户未操作时效?
2.如何监听用户的行为?
3.如何处理操作行为与操作时效的关系?

反思

1.监听用户未操作时效是否需要使用到定时器?
2.监听用户的行为与时效关系是否建立在onTouch的down、move、up中?
3.场景完善的时候是否考虑生命周期的问题?

实现
自定义CountTimer:用于监听计时过程与结果

注:如需跳转activity、弹出toast可能均需要传入上下文,可以根据场景内部封装application的上下文,或者对应Activity、fragment的上下文 - - ~

package nkwl.com.timescreen;

import android.os.CountDownTimer;
import android.util.Log;

/**
 * @author MrLiu
 * @date 2019/11/18
 * desc
 */
public class CountTimer extends CountDownTimer {

    public CountTimer(long millisInFuture, long countDownInterval) {
        super(millisInFuture, countDownInterval);
    }

    //计时过程显示:如有需求你可以在特定的时间范围内执行自己操作
    @Override
    public void onTick(long l) {
        Log.e("tag", l + "");
    }

    //计时完毕时触发:我们的需求中的实现逻辑在这里,一般都逻辑会跳转一个屏保的Activity
    @Override
    public void onFinish() {
        Log.e("tag", "未来某一天,可能依旧拥有无限希望");
    }
}
BaseActivity:用于监听用户行为,处理行为与时间之间的关系

注:此处写在Base类主要针对的全局对象,具体场景根据个人需求而定,如只需要部分场景使用,那么把关键代码抄到对应类即可

package nkwl.com.timescreen;

import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;

/**
 * @author MrLiu
 * @date 2019/11/19
 * desc
 */
public class BaseActivity extends AppCompatActivity {
    private CountTimer countTimerView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        init();
    }

    private void init() {
        //初始化CountTimer,设置倒计时为2分钟。
        countTimerView = new CountTimer(5000, 1000);
    }


    private void timeStart() {
        new Handler(getMainLooper()).post(new Runnable() {
            @Override
            public void run() {
                countTimerView.start();
            }
        });
    }

    /**
     * 主要的方法,重写dispatchTouchEvent
     *
     * @param ev
     * @return
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            //获取触摸动作,如果ACTION_UP,计时开始。
            case MotionEvent.ACTION_UP:
                countTimerView.start();
                break;
            //否则其他动作计时取消
            default:
                countTimerView.cancel();
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    protected void onResume() {
        super.onResume();
        timeStart();
    }

    @Override
    protected void onPause() {
        super.onPause();
        countTimerView.cancel();
    }
}
MainActivity:使用类(简称:鸡肋展示类;毕竟各位都是聪明人,其实这块我说明与否都一样)

注:如此需求适用全局,那么继承BaseActivity即可

package nkwl.com.timescreen;

import android.os.Bundle;

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方那座山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值