首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 時鐘應用設計:系統時間顯示與用戶設置時間同步方案

     編輯:程式設計綜合問答

設計 Android 程序實現:數字時鐘+模擬時鐘顯示系統時間,通過 DatePicker/TimePicker 設置時間並同步顯示。核心在於 Calendar 實例的傳遞與同步機制。

架構設計

單 Activity + DialogFragment(推薦)

避免兩個 Activity 切換帶來的數據傳遞複雜度,主界面彈出設置對話框。


public class ClockActivity extends AppCompatActivity {
    private AnalogClock analogClock;
    private TextView digitalClock;
    private Calendar currentTime = Calendar.getInstance(); // 核心時間模型
    private Handler timeHandler = new Handler(Looper.getMainLooper());
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_clock);
        
        analogClock = findViewById(R.id.analog_clock);
        digitalClock = findViewById(R.id.digital_clock);
        
        // 1. 初始同步系統時間
        syncSystemTime();
        
        // 2. 啟動秒級更新
        startClockTick();
        
        // 3. 設置按鈕點擊
        findViewById(R.id.btn_set_time).setOnClickListener(v -> showTimePickerDialog());
    }
    
    private void syncSystemTime() {
        currentTime = Calendar.getInstance(); // 獲取當前系統時間
        updateDisplay();
    }
    
    private void startClockTick() {
        timeHandler.postDelayed(new Runnable() {
            @Override public void run() {
                currentTime.add(Calendar.SECOND, 1); // 模型自增
                updateDisplay();
                timeHandler.postDelayed(this, 1000);
            }
        }, 1000);
    }
    
    private void updateDisplay() {
        // 數字時鐘
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss", Locale.getDefault());
        digitalClock.setText(sdf.format(currentTime.getTime()));
        
        // 模擬時鐘(AnalogClock 已棄用,建議自定義 View 或用 TextClock)
        // analogClock 會自動跟隨系統時間,若需跟隨 currentTime 需自定義
    }
    
    private void showTimePickerDialog() {
        TimePickerDialog dialog = new TimePickerDialog(this,
            (view, hourOfDay, minute) -> {
                currentTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
                currentTime.set(Calendar.MINUTE, minute);
                currentTime.set(Calendar.SECOND, 0);
                updateDisplay();
            },
            currentTime.get(Calendar.HOUR_OF_DAY),
            currentTime.get(Calendar.MINUTE),
            true // 24小時制
        );
        dialog.show();
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        timeHandler.removeCallbacksAndMessages(null);
    }
}

雙 Activity 方案(若必須分離)

通過 Intent 傳遞 Calendar 序列化數據:


// ClockActivity → 設置時間
Intent intent = new Intent(this, SetTimeActivity.class);
intent.putExtra("time_millis", currentTime.getTimeInMillis());
startActivityForResult(intent, REQUEST_SET_TIME);

// SetTimeActivity 返回結果
Intent result = new Intent();
result.putExtra("time_millis", pickerCalendar.getTimeInMillis());
setResult(RESULT_OK, result);
finish();

// ClockActivity 接收
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_SET_TIME && resultCode == RESULT_OK) {
        long millis = data.getLongExtra("time_millis", -1);
        if (millis != -1) {
            currentTime.setTimeInMillis(millis);
            updateDisplay();
        }
    }
}

核心類:Calendar 詳解

現代替代:java.time (API 26+)


// 更清晰、不可變、線程安全
LocalTime currentTime = LocalTime.now(); // 系統時間
currentTime = currentTime.plusSeconds(1); // 運算返回新對象
currentTime = currentTime.withHour(14).withMinute(30); // 設置

// 格式化
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
digitalClock.setText(currentTime.format(formatter));

項目 minSdkVersion 26+ 強烈建議遷移至 java.time。

模擬時鐘實現建議

  • 自定義 View 重寫 onDraw(Canvas),根據 currentTime 計算時/分/秒針角度繪製
  • 或使用開源庫:com.github.lzyzsd:circleprogress、AnalogClockView
  • 系統 AnalogClock / TextClock 僅跟隨系統時間,不可外部控制

總結

Android 時鐘應用核心:單一 Calendar/LocalTime 模型作為時間真實源。UI 組件(數字/模擬時鐘、TimePicker)均作為該模型的「視圖」,通過監聽/回調雙向同步。推薦單 Activity + DialogFragment 架構,避免跨 Activity 序列化開銷。API 26+ 優先使用 java.time 替代 Calendar。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法用途
getInstance()獲取當前時區/ Locale 的 Calendar 實例(系統時間)
getTimeInMillis()獲取毫秒時間戳(long),可序列化傳遞
setTimeInMillis(long)從時間戳恢復 Calendar 狀態
add(field, amount)日期運算(如加 1 秒、減 1 天)
set(field, value)設置具體字段(HOUR_OF_DAY, MINUTE 等)
getTime()返回 Date 對象,供 SimpleDateFormat 格式化