这是小弟第一次写博客,旨在记录自己的IT学习之路,总结编程开发知识,与更多朋友分享交流学习。若有不足,请多指教。
在我们实际Android开发中,有时候会有“用户一段时间不操作程序,执行某些事件”的需求,正好现在公司项目实现了这个需求,特地写了这篇博客记录。
声明一下,重新开始计时不是通过右下角的按钮控制的,是通过Activity的onUserInteraction() + CountDownTimer控制的。右下角的按钮仅仅用做Toast。
Android对用户操作在Activity提供了一个回调onUserInteraction();顾名思义,这个方法在用户交互(触摸屏幕)的时候的回调。
在Android开发过程中,常常会有类似“60秒重新获得验证码”的倒计时需求,Android为我们提供了CountDownTimer类,就是封装了倒计时功能。
为了实现对整个应用的监测用户行为,必须编写一个Activity基类,项目所有的Activity均继承于这个Activity。
/*** @Author lankang* @Date 16/5/25*/
public class BaseActivity extends AppCompatActivity {//倒计时总时间public static final long COUNTDOWN_TIME = 10000;@Overridepublic void onUserInteraction() {MyTimer timer Instance(COUNTDOWN_TIME,1000,this);//先取消timer.cancel();View.setText("倒计时:10秒,弹出提示框");//再开始timer.start();UserInteraction();}
}
可以看出,核心功能在自定义的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);t = context;this.millisInFuture = millisInFuture;}@Overridepublic void onTick(long time) {//TODO 每隔countDownInterval执行//demo这里仅做提示View.setText("倒计时:" + ((time/1000) + 1) + "秒,弹出提示框");}@Overridepublic void onFinish() {//TODO 计时完成View.setText("倒计时:1秒,弹出提示框");String time = String.valueOf(millisInFuture/1000);AlertDialog.Builder builder =new AlertDialog.Builder(context);builder.setTitle("提示").setMessage(time + "秒未操作程序。").setNegativeButton("取消", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialogInterface, int i) {dialogInterface.dismiss();}}).setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic 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提示。
编写好BaseActivity和计时器MyTimer,只要将Activity继承与BaseActivity就能实现前面所说需求了。
public class MainActivity extends BaseActivity {//static 可以忽略,只是方便demo提示public static TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = (Toolbar) findViewById(lbar);setSupportActionBar(toolbar);FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);textView = (TextView) findViewById(R.id.tv);fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Toast.makeText(MainActivity.this,"重新计时!",Toast.LENGTH_SHORT).show();}});}}
第一次博客完成了,虽然是个小技术,也希望是个好的开始,对各位朋友有所帮助。
本文发布于:2024-02-01 12:35:06,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170676210836634.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |