AnalogClockDigitalClock的原理

范例说明

Android中的AnalogClock Widget是一个时钟对象,本范例将配置一个小时钟,并在其下放置一个TextView,为了做对照,上面放置的是模拟时钟,下面的TextView则模拟电子时钟,将AnalogClock的时间以数字钟形式显示。

本范例的重点,在Android.os.Handlerjava.lang.Thread以及Android.os.Message三对象的整合应用。通过产生Thread对象,在进程内同步调用System.currentTimeMillis()取得系统时间,并且通过Message对象来通知Handler对象,Handler则扮演联系ActivityThread之间的桥梁,在收到Message对象后,将时间变量的值,显示于TextView当中,产生数字时钟的外观与功能。

范例程序

src/irdc.ex04_14/EX04_14.java

主程序需要另外加载JavaCalendarThread对象,在onCreate()中构造HandlerThread两对象,并实现handelMessage()run()两个方法,如下所述:

/* import程序略 */

import android.widget.AnalogClock;

public class EX04_14 extends Activity

{

/*声明一常数作为判别信息用*/

protected static final int GUINOTIFIER = 0x1234;

/*声明两个widget对象变量*/

private TextView mTextView;

public AnalogClock mAnalogClock;

/*声明与时间相关的变量*/

public Calendar mCalendar;

public int mMinutes;

public int mHour;

/*声明关键HandlerThread变量*/

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 EX04_14.GUINOTIFIER:

/* 在这处理要TextView对象Show时间的事件 */

mTextView.setText(mHour+" : "+mMinutes);

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);

/*让进程休息一秒*/

Thread.sleep(1000);

/*重要关键程序:取得时间后发出信息给Handler*/

Message m = new Message();

m.what = EX04_14.GUINOTIFIER;

EX04_14.this.mHandler.sendMessage(m);

}while(EX04_14.LooperThread.interrupted()==false);

/*当系统发出中断信息时停止本循环*/

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

}

扩展学习

其实要达到本范例效果的代码应该只有两行,也就是将笔者对于TextView与进程Thread的处理,改为使用widget.DigitalClock的方式,写法如下:

import android.widget.AnalogClock

mDigitalClock =(DigitalClock)findViewById(R.id.myDigitalClock);

而本程序使用TextView来模拟DigitalClock的做法,实际上,也是参考AnalogClockDigitalClock这两个widget的代码所做的练习,对于将来实现Timer相关的小对象,会有所帮助。

Android提供了System.currentTimeMillis()uptimeMillis()elapsedRealtime()这三种不同特性的System Clock给开发者使用。本范例使用System.currentTimeMillis()就是标准的Clock用法,需要搭配真实的日期与时间使用,另外两者则是适用于intervalelapse time来控制程序与UI之用,读者可以自己练习。

更多相关文章

  1. Android(安卓)Jetpack 系列篇(二) WorkManager
  2. 深入理解 Android(安卓)的 IPC 机制--------Binder
  3. Android(安卓)时间选择器年 月 日
  4. 开发必读:如何成为一名优秀的Android开发者
  5. Android(安卓)ApiDemos示例解析(106):Views->Chronometer
  6. UI线程处理Handle
  7. android 知识点汇总 这一篇就够了
  8. Android(安卓)中设计模式
  9. Android电话系统之RIL-Java

随机推荐

  1. 第一个Android登录页面 | HTTP 请求验证
  2. android的xml控件遇到的问题(1)
  3. Android 解决阿里云直播水印问题
  4. android 改变bitmap颜色
  5. android中ListView数据刷新时的同步
  6. Android 使用ContentObserver监听短信的
  7. Android改变系统自带ProgressDialog的文
  8. Android 实现手机震动功能
  9. android中获取包名,类名
  10. android 跳转到小米手机神隐模式