參照Google的鬧鐘源碼,提取出來其中的一個部分,獲取系統的當前時間,並實時進行更新顯示,寫成一個控件view,以後有需要的話可以放在自己的App中,當做一個通用的控件來使用。本例子中只是簡單的把源代碼中的相關內容和邏輯提取了出來,並沒有做美化的工作,但思路就是這樣的,按個人喜歡去修改就可以了。該控件顯示有兩種狀態,一個是24小時制的時候會顯示形如“15:30”的風格,12小時制的時候會顯示“8:00上午”的風格,根據自己系統的設定而識別,下面的是顯示後的兩張截圖,圖中的時間顯示區域就是主要實現的控件了。
圖中上下午的顯示是根據你的系統的語言而定的,圖中是中文顯示“上午”,若英文則顯示“AM”
這個名爲DigitalClock的控件繼承自LinearLayout,並在其中做了相關的更改與控制,主要的代碼塊有如下:
註冊了一個廣播,當檢測到系統的時區內容發生變化時,更新下時間以便正確的顯示
/** 時區發生變化的廣播接收者 */
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if (intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED)) {
mCalendar = Calendar.getInstance();
}
updateTime();
}
};
寫一個觀察者類,目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理
/** 當時間改變時的觀察者類 */
private class FormatChangeObserver extends ContentObserver {
public FormatChangeObserver() {
super(new Handler());
}
@Override
public void onChange(boolean selfChange) {
// TODO Auto-generated method stub
super.onChange(selfChange);
setDateFormat();
updateTime();
}
}
同時還要在onAttachedToWindow()和onDetachedFromWindow()方法中對觀察者進行註冊和取消註冊
@Override
protected void onAttachedToWindow() {
// TODO Auto-generated method stub
super.onAttachedToWindow();
if (mAttached)
return;
mAttached = true;
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_TIME_CHANGED);
filter.addAction(Intent.ACTION_TIME_TICK);
filter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
getContext().registerReceiver(receiver, filter);
mFormatChangeObserver = new FormatChangeObserver();
getContext().getContentResolver().registerContentObserver(
Settings.System.CONTENT_URI, true, mFormatChangeObserver);
updateTime();
}
@Override
protected void onDetachedFromWindow() {
// TODO Auto-generated method stub
super.onDetachedFromWindow();
if (!mAttached)
return;
mAttached = false;
getContext().unregisterReceiver(receiver);
getContext().getContentResolver().unregisterContentObserver(
mFormatChangeObserver);
}
這個小控件只是安卓鬧鐘的電子鐘部分,要想實現鬧鐘還要有好多東西實現,嘗試去仿照源碼寫個小鬧鐘,不過單獨的這個控件也是蠻有用的。