android简易记时器

android简易倒计时器

      这是一个android平台的简易倒计时器,可以实现设置时间的倒计时以及时间到后的提醒功能。

      android sdk提供的CountdownTimer 类已经实现的倒计时功能,但却没有暂停,继续等功能,在这个类的基础上可以实现一个自己的计时类。

      package com.util;

import android.os.Handler;
import android.os.Message;
//在android自带的CountdownTimer类基础上实现定时功能
public abstract class AdvancedCountdownTimer {
	private static final int MSG_RUN = 1;	

	private final long mCountdownInterval;// 定时间隔,以毫秒计
	private long mTotalTime;// 定时时间
	private long mRemainTime;// 剩余时间

	// 构造函数
	public AdvancedCountdownTimer(long millisInFuture, long countDownInterval) {
		mTotalTime = millisInFuture;
		mCountdownInterval = countDownInterval;
		mRemainTime = millisInFuture;
	}

	// 取消计时
	public final void cancel() {
		mHandler.removeMessages(MSG_RUN);
	}

	// 重新开始计时
	public final void resume() {
		mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(MSG_RUN));
	}

	// 暂停计时
	public final void pause() {
		mHandler.removeMessages(MSG_RUN);
	}

	// 开始计时
	public synchronized final AdvancedCountdownTimer start() {
		if (mRemainTime <= 0) {// 计时结束后返回
			onFinish();
			return this;
		}
		// 设置计时间隔
		mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_RUN),
				mCountdownInterval);
		return this;
	}

	public abstract void onTick(long millisUntilFinished, int percent);// 计时中

	public abstract void onFinish();// 计时结束

	// 通过handler更新android UI,显示定时时间
	private Handler mHandler = new Handler() {

		@Override
		public void handleMessage(Message msg) {

			synchronized (AdvancedCountdownTimer.this) {
				if (msg.what == MSG_RUN) {
					mRemainTime = mRemainTime - mCountdownInterval;

					if (mRemainTime <= 0) {
						onFinish();
					} else if (mRemainTime < mCountdownInterval) {
						sendMessageDelayed(obtainMessage(MSG_RUN), mRemainTime);
					} else {

						onTick(mRemainTime, new Long(100
								* (mTotalTime - mRemainTime) / mTotalTime)
								.intValue());

						sendMessageDelayed(obtainMessage(MSG_RUN),
								mCountdownInterval);
					}
				} 
			}
		}
	};
}

      这是一个抽象工具类,在主程序中编写一个类继承它就可以实现相应的计时功能。

 

package com.timer;

import java.io.IOException;
import com.util.AdvancedCountdownTimer;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Button;
import android.widget.Toast;

public class Timer extends Activity implements OnClickListener {

	private TextView txt_time = null;//显示剩余时间
	private EditText edt_hour = null;//定时时间编辑框
	private EditText edt_minute = null;
	private EditText edt_second = null;
	private Button btn_start = null;//各个按钮
	private Button btn_pause = null;
	private Button btn_con = null;
	private Button btn_reset = null;
	private Button btn_exit = null;

	private long hour = 0;//时间变量
	private long minute = 0;
	private long second = 0;
	private long time = 0;

	private MyCount count = null;//定时类对象

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		findViews();
		setListener();
		}
    //识别各个控件并设置按钮状态
	private void findViews() {
		txt_time = (TextView) findViewById(R.id.text);
		edt_hour = (EditText) findViewById(R.id.hour);
		edt_minute = (EditText) findViewById(R.id.minute);
		edt_second = (EditText) findViewById(R.id.second);
		btn_start = (Button) findViewById(R.id.start);
		btn_pause = (Button) findViewById(R.id.pause);
		btn_con = (Button) findViewById(R.id.con);
		btn_reset = (Button) findViewById(R.id.reset);
		btn_exit = (Button) findViewById(R.id.exit);
		btn_pause.setEnabled(false);
		btn_con.setEnabled(false);

	}
    //绑定监听器
	private void setListener() {
		btn_start.setOnClickListener(this);
		btn_pause.setOnClickListener(this);
		btn_con.setOnClickListener(this);
		btn_reset.setOnClickListener(this);
		btn_exit.setOnClickListener(this);

	}
   //获取设置的时间并判断输入是否为空
	private boolean setTime() {
		String strHour = edt_hour.getText().toString();//取控件的值
		String strMinute = edt_minute.getText().toString();
		String strSecond = edt_second.getText().toString();
		if (strHour.equals("") || strMinute.equals("") || strSecond.equals("")) {
			return false;
		} else {
			hour = Long.parseLong(strHour);
			minute = Long.parseLong(strMinute);
			second = Long.parseLong(strSecond);
			time = (hour * 3600 + minute * 60 + second) * 1000;
			count = new MyCount(time, 1000);
			return true;
		}

	}
    //设置监听器
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		//点击开始计时按钮
		case R.id.start:
			if (setTime() == false) {
				Toast.makeText(Timer.this, "请输入完整定时时间", Toast.LENGTH_LONG)
						.show();
			} else {
				count.start();//开始计时
				btn_start.setEnabled(false);
				btn_pause.setEnabled(true);
			}
			break;
			//点击暂停按钮
		case R.id.pause:
			count.pause();//暂停
			btn_pause.setEnabled(false);
			btn_con.setEnabled(true);
			break;
			//点击继续按钮
		case R.id.con:
			count.resume();//继续
			btn_pause.setEnabled(true);
			btn_con.setEnabled(false);
			break;
			//点击重置按钮
		case R.id.reset:
			count.cancel();//取消及时,重置界面状态
			txt_time.setText("");
			edt_hour.setText("0");
			edt_hour.setText("0");
			edt_second.setText("30");
			btn_pause.setEnabled(false);
			btn_con.setEnabled(false);
			btn_start.setEnabled(true);			
			break;
			//点击退出按钮
		case R.id.exit:
			android.os.Process.killProcess(android.os.Process.myPid());//退出
			break;
		default:
			break;

		}

	}
    //实现计时功能的类
	class MyCount extends AdvancedCountdownTimer {

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

		@Override
		public void onFinish() {
			//媒体对象
			final MediaPlayer media = MediaPlayer.create(Timer.this, R.raw.alarm);
			//对话框对象
			final AlertDialog mydialog = new AlertDialog.Builder(Timer.this).setMessage(
					"时间到!").setPositiveButton("确定", new DialogInterface.OnClickListener(){

						@Override
						public void onClick(DialogInterface dialog, int which) {
							media.stop();
							media.release();
							btn_pause.setEnabled(false);
							btn_con.setEnabled(false);
							btn_start.setEnabled(true);	
						}
						
					}).create();
			mydialog.show();//播放结束后显示对话框
			txt_time.setText("");
			try {
				media.prepare();	//准备播放音乐			
			} catch (IllegalStateException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			media.start();//播放音乐
			media.setOnCompletionListener(new OnCompletionListener() {//播放结束后会话框消失,重置按钮状态
				@Override
				public void onCompletion(MediaPlayer mp) {
					mydialog.hide();
					btn_pause.setEnabled(false);
					btn_con.setEnabled(false);
					btn_start.setEnabled(true);	

				}
			});

		}	
        //更新剩余时间
		@Override
		public void onTick(long millisUntilFinished, int percent) {
			long myhour = (millisUntilFinished / 1000) / 3600;
			long myminute = ((millisUntilFinished / 1000) - myhour * 3600) / 60;
			long mysecond = millisUntilFinished / 1000 - myhour * 3600
					- myminute * 60;
			txt_time.setText("剩余时间" + myhour + ":" + myminute + ":" + mysecond);				

		}

	}

}

运行效果如下:

初始界面:

android简易记时器

计时中:

android简易记时器

时间到:

android简易记时器

 

       这里我还要说一件事,上次我写的那篇音乐播放器的帖子由于我自身的一些原因,暂时不能将其发表,在此我决定将其删除,以后有时间再来发表。

 

 

1 楼 莫言_MoYan 2012-04-10  
顶一个,感谢楼主啊!