前言
这是小弟第一次写博客,旨在记录自己的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();
}
});
}
}
总结
第一次博客完成了,虽然是个小技术,也希望是个好的开始,对各位朋友有所帮助。
本文介绍了如何在Android应用中监测用户行为,当用户一段时间无操作时,通过`onUserInteraction()`结合`CountDownTimer`自动触发特定事件。通过创建一个Activity基类并实现倒计时逻辑,实现全应用范围的用户无操作监测功能。
453

被折叠的 条评论
为什么被折叠?



