android.os.Handler:通常产生的Thread对象在进程内同步调用System.currentTimeMillis()方法,这样可以取得系统时间。
java.lang.Thread:是联系Activity与Thread的桥梁。
android.os.Message:使用Message对象通知Handler对象,在收到Message对象后将时间变量的值显示在TextView中,这样就实现了数字时钟功能。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/widget27"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
>
<AnalogClock
android:id="@+id/myAnalogClock"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
>
</AnalogClock>
<TextView
android:id="@+id/myTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="20sp"
android:textColor="@drawable/white"
android:layout_gravity="center_horizontal"
>
</TextView>
</LinearLayout>
package com.EX030;
import android.app.Activity;
import android.os.Bundle;
/*这里我们需要使用Handler类与Message类来处理运行线程*/
import android.os.Handler;
import android.os.Message;
import android.widget.AnalogClock;
import android.widget.TextView;
/*需要使用Java的Calendar与Thread类来取得系统时间*/
import java.util.Calendar;
import java.lang.Thread;
import com.EX030.R;
public class EX030 extends Activity
{
/*声明一常数作为判别信息用*/
protected static final int GUINOTIFIER = 0x1234;
/*声明两个widget对象变量*/
private TextView mTextView;
public AnalogClock mAnalogClock;
/*声明与时间相关的变量*/
public Calendar mCalendar;
public int mSecond;
public int mMinutes;
public int mHour;
/*声明关键Handler与Thread变量*/
public Handler mHandler;
private Thread mClockThread;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
/*通过findViewById取得两个widget对象*/
mTextView=(TextView)findViewById(R.id.myTextView);
mAnalogClock=(AnalogClock)findViewById(R.id.myAnalogClock);
/*通过Handler来接收运行线程所传递的信息并更新TextView*/
mHandler = new Handler()
{
public void handleMessage(Message msg)
{
/*这里是处理信息的方法*/
switch (msg.what)
{
case EX030.GUINOTIFIER:
/* 在这处理要TextView对象Show时间的事件 */
mTextView.setText(mHour+" : "+mMinutes+":"+mSecond);
break;
}
super.handleMessage(msg);
}
};
/*通过运行线程来持续取得系统时间*/
mClockThread=new LooperThread();
mClockThread.start();
}
/*改写一个Thread Class用来持续取得系统时间*/
class LooperThread extends Thread
{
public void run()
{
super.run();
try
{
do
{
/*取得系统时间*/
long time = System.currentTimeMillis();
/*通过Calendar对象来取得小时与分钟*/
final Calendar mCalendar = Calendar.getInstance();
mCalendar.setTimeInMillis(time);
mHour = mCalendar.get(Calendar.HOUR);
mMinutes = mCalendar.get(Calendar.MINUTE);
mSecond=mCalendar.get(Calendar.SECOND);
/*让运行线程休息一秒*/
Thread.sleep(1000);
/*重要关键程序:取得时间后发出信息给Handler*/
Message m = new Message();
m.what = EX030.GUINOTIFIER;
EX030.this.mHandler.sendMessage(m);
}while(EX030.LooperThread.interrupted()==false);
/*当系统发出中断信息时停止本循环*/
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
}