`
lovelease
  • 浏览: 385677 次
社区版块
存档分类
最新评论

Android实现可自动关闭的定时器

阅读更多
之前一篇文章里有用到过一个封装好的定时器工具类,现在又做了一些升级,支持自定义响应多少次以后自动关闭,这里单独共享出来:
package com.example.util;

import java.util.Timer;
import java.util.TimerTask;

import com.example.CnLog;

import android.os.Handler;
import android.os.Message;

/**
 * Generate a timer object with specified 'delay' and 'period', 
 * you can handle events with 'TimerManager.LOAD_PROGRESS' 
 * and 'TimerManager.CLOSE_PROGRESS', then do your progress.
 * If you want to get 'timerId', just get it from 'arg1'
 * 
 * @author jackie
 *
 */
public class Manager {

	private static final String TAG = TimerManager.class.getSimpleName();
	private Handler mHandler;
	/** Timer **/  
    private Timer timer = null;  
    /** TimerTask **/  
    private TimerTask timerTask = null;
    /** Delay Time in milliseconds **/  
    private int mDelay;
    /** Period in milliseconds **/  
    private int mPeriod;
    /** trigger times **/  
    private int mTimes = -1;
    /** Timer in progressing flag **/  
    public static final int LOAD_PROGRESS = 0;  
    /** Timer close flag **/  
    public static final int CLOSE_PROGRESS = 1;  
    /** TimerId **/  
    private int mTimerId = 0;
    
    /**
     * Construct a unlimited timer
     * 
     * @param delay amount of time in milliseconds before first execution
     * @param period amount of time in milliseconds between subsequent executions
     */
    public TimerManager(int delay, int period) {
    	this.mDelay = delay;
    	this.mPeriod = period;
    }
    
    /**
     * Construct a unlimited timer, with specified handler
     * 
     * @param handler your own handler to handle the events from this timer
     * @param delay amount of time in milliseconds before first execution
     * @param period amount of time in milliseconds between subsequent executions
     */
    public TimerManager(Handler handler, int delay, int period) {
    	this(delay, period);
    	this.mHandler = handler;
    }
    
    /**
     * Construct a times-limited timer
     * 
     * @param delay amount of time in milliseconds before first execution
     * @param period amount of time in milliseconds between subsequent executions
     * @param times auto close timer after how many times, minimum is 1
     */
    public TimerManager(int delay, int period, int times){
    	this(delay, period);
    	if (times < 1) {
    		throw new IllegalArgumentException("times can not smaller than 1");
    	}
    	this.mTimes = times;
    }
    
    /**
     * Construct a times-limited timer, with specified handler
     * 
     * @param handler your own handler to handle the events from this timer
     * @param delay amount of time in milliseconds before first execution
     * @param period amount of time in milliseconds between subsequent executions
     * @param times auto close timer after how many times, minimum is 1
     */
    public TimerManager(Handler handler, int delay, int period, int times) {
    	this(handler, delay, period);
    	if (times < 1) {
    		throw new IllegalArgumentException("times can not smaller than 1");
    	}
    	this.mTimes = times;
    }
    
	public void startTimer() {
		CnLog.w(TAG, "==========> Start timer!");
        if (timerTask == null) {
            timerTask = new TimerTask() {
                @Override  
                public void run() {
                    Message msg = new Message();  
                    msg.what = LOAD_PROGRESS;  
                    msg.arg1 = (int) (++mTimerId);
                    if (mHandler != null) {
                    	mHandler.sendMessage(msg);
                    }
                    // Have times-limit, and already reached
                    if (mTimes != -1 && mTimerId == mTimes) {
                    	closeTimer();
                    }
                }  
            };
            timer = new Timer();  
            timer.schedule(timerTask, mDelay, mPeriod);  
        }  
    }
  
    public void closeTimer() {
    	CnLog.w(TAG, "==========> Close timer!");
        if (timer != null) {  
            timer.cancel();  
            timer = null;  
        }  
        if (timerTask != null) {  
            timerTask = null;  
        }  
        mTimerId = 0;
        if (mHandler != null) {
        	mHandler.sendEmptyMessage(CLOSE_PROGRESS);
        }
    }
    
    public void setHandler(Handler handler) {
    	this.mHandler = handler;
    }
}


用法很简单,定义自己的handler以响应定时任务,在合适的地方打开和关闭定时器即可:
private void insTimer() {
		Handler handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				switch (msg.what) {
				case TimerManager.LOAD_PROGRESS:
					int timerId = msg.arg1;
					CnLog.d(TAG, "Timer in processing. timerId: " + timerId);
					if (getCodeTv != null) {
						getCodeTv.setVisibility(View.GONE);
					}
					if (resendLl != null) {
						resendLl.setVisibility(View.VISIBLE);
						int remain = MAX_TIMES - timerId;
						String resendDisp = "(" + remain + ")";
						remainTv.setText(resendDisp);
					}
					break;
				case TimerManager.CLOSE_PROGRESS:
					CnLog.d(TAG, "Timer closed.");
					if (getCodeTv != null) {
						getCodeTv.setVisibility(View.VISIBLE);
					}
					if (resendLl != null) {
						resendLl.setVisibility(View.GONE);
					}
					break;
				}
				super.handleMessage(msg);
			}
			
		};
		timer = new TimerManager(handler, 0, 1000, MAX_TIMES);
	}
// Start timer
timer.startTimer();
// Stop timer
timer.closeTimer();
分享到:
评论

相关推荐

    定时器-自动关机自动打开

    在"定时器-自动关机自动打开"场景中,"自动关机"是指设置电脑在特定时间自动关闭,以节省能源或在无人操作时保持安全。在Windows系统中,可以使用"任务计划程序"创建一个脚本,该脚本调用shutdown命令来实现自动关机...

    Android 三种实现定时器详解及实现方法

    本文将详细介绍三种实现Android定时器的方法,并提供相应的代码示例。 ### 方法一:Handler + Thread 这种方法利用了Android的消息机制。首先创建一个`Handler`对象,然后在一个后台线程(通常是一个`Thread`)中...

    android定时器实现每天定时执行任务.rar

    在Android开发中,有时我们需要实现一个功能,让应用在特定的时间点自动执行某项任务,例如每天定时发送通知、更新数据等。这个场景下,我们可以使用Android的定时器(Timer)或者AlarmManager来实现。本压缩包文件...

    Android实现闹钟的所有功能(Android studio)

    在Android平台上,开发一款闹钟应用需要掌握一系列关键知识点,包括但不限于系统广播接收者、定时器、通知管理、用户界面设计以及数据存储等。以下是对这些核心概念的详细阐述: 1. **系统广播接收者...

    安卓Android源码——Android自动开关机实现.zip

    在安卓(Android)系统中,实现自动开关机功能涉及到对操作系统底层的深度理解和代码修改。这一功能并非在标准的Android开放源代码项目(AOSP)中直接提供,但可以通过自定义ROM或者系统服务来实现。以下是对这个...

    android7 关闭ANR对话框代码

    然后,AppErrors会启动一个定时器,在预设的时间间隔后自动关闭这个对话框。这样,如果应用程序在一定时间内恢复响应,用户界面就不会一直被ANR对话框占据。 2. **AppNotRespondingDialog.java**:这个类负责构建和...

    android定时器

    "Android定时器"就是实现这一功能的关键组件。本文将深入探讨Android中的定时器机制,包括其工作原理、使用方法以及注意事项。 1. **定时器(Timer)类** Android中的`Timer`类是Java `java.util.Timer`类的一个...

    Android蓝牙搜索自动匹配等综合Demo

    本教程将深入探讨如何实现一个综合的Android蓝牙搜索、连接、自动重连功能,并结合EventBus库来实现全局蓝牙状态的监听。以下是这个"Android蓝牙搜索自动匹配等综合Demo"的关键知识点: 1. **蓝牙API**: - ...

    Android拍照,连拍以及自动拍照

    在Android平台上,拍照功能是移动应用开发中不可或缺的一部分。无论是社交应用、生活记录还是其他实用工具,拍照功能都扮演着重要角色。本文将深入探讨如何实现Android应用中的基本拍照、连拍以及自动拍照功能。 ...

    Android-一个基于okio的简化Socket操作的android框架实现Socket断线自动连接

    这个名为"OkioSocketDemo"的项目专注于使用Okio库来简化Android上的Socket操作,并且特别强调了实现Socket断线后的自动重连功能。下面将详细探讨相关知识点。 1. **Okio库**:Okio是由Square公司开发的一个Java I/O...

    定时器软件

    - **任务自动化**:除了简单的声音提醒,定时器软件还可以与操作系统或其他应用程序集成,实现自动化任务,如定时备份文件、自动关闭电脑等。 - **多任务管理**:支持同时设定多个定时器,每个定时器独立运行,...

    Android实现带指示器的自动轮播式ViewPager

    【Android实现带指示器的自动轮播式ViewPager】 在Android应用开发中,有时我们需要展示一组内容,例如广告或推荐信息,这时使用一个自动轮播的ViewPager就非常合适。这种组件通常包含一个ViewPager来承载多个子...

    安卓程序登录后一段时间不进行操作,自动退出程序

    通过以上步骤,你可以在Android应用中实现用户长时间无操作自动退出的功能。记得在编码过程中遵循最佳实践,确保代码的稳定性和效率。在实际项目中,还需要根据具体需求进行相应的调整和优化。在提供的`Demo`文件中...

    Android TextView自动滚动

    首先,Android中的TextView本身并不直接支持自动滚动,但可以通过一些技巧来实现。在描述中提到的"源码里面有两个自定义的TextView",很可能是指开发者通过继承TextView并重写其相关方法,实现了上下和左右的自动...

    android 开机自启动+后台服务+自动关机

    在Android系统中,实现“开机自启动+后台服务+自动关机”功能涉及到多个关键知识点。下面将逐一详细解释这些概念及其实现方法。 1. **开机自启动**:Android设备开机后,允许开发者通过注册BroadcastReceiver来监听...

    android实现滚动悬浮显示

    在你提供的"android实现滚动悬浮显示"项目中,重点在于如何创建这样一个悬浮窗口,并实现字幕的自动滚动效果。 首先,我们需要理解Android中的悬浮窗口是如何实现的。这通常涉及到两个关键概念:`TYPE_SYSTEM_ALERT...

    android 到圆点的自动轮播图片

    这个“android 到圆点的自动轮播图片”项目就是一个典型的实例,它利用定时器(Timer)来实现图片的自动切换,并通过小圆点来指示当前显示的是哪一张图片。 首先,我们来讨论一下Android中的图片轮播技术。通常,...

    Android Studio下的串口通信实例项目,已通过测试 可实现对于串口的设置、打开、发送、接收、自动发送等操作.zip

    6. **自动发送**: 自动发送功能可能是设置一个定时器或者监听某个事件触发数据发送,例如每隔一段时间发送一次数据,或者在接收到特定指令后自动响应。 7. **测试**: 为了确保串口通信的正确性,开发者需要进行各种...

    AnimPopup(可以自动消失的弹出窗,实现 + 1 效果,自动淡出 )

    4. **PopupWindow的交互**:可以监听PopupWindow的触摸事件,例如当用户点击PopupWindow外部时,可以选择自动关闭。 5. **PopupWindow的消失**:调用dismiss()方法可关闭PopupWindow,但AnimPopup增加了自动淡出的...

    Android自动关机源码

    以下是对"Android自动关机源码"的详细解释。 首先,Android系统的自动关机涉及到的关键知识点包括: 1. **BroadcastReceiver**:这是Android中的一个关键组件,用于接收并响应系统广播事件。在自动关机的场景下,...

Global site tag (gtag.js) - Google Analytics