【问题标题】:How to create a Digital Clock on Android?如何在 Android 上创建数字时钟?
【发布时间】:2014-02-22 00:23:21
【问题描述】:

我一直在尝试为 Android 编写一个简单的数字时钟应用程序。首先,我使用内置的数字时钟并尝试省略秒显示,但我做不到。我想要时钟的秒数来触发我拥有的一些代码行。

然后我开始开发简单的应用程序将数字显示在屏幕上,但我不知道如何以最有效的方式触发显示。任何人都可以给我一个简单的开始,在哪里看和使用什么功能?如何在每秒内执行几行代码?我在Display the current time and date in an Android application 尝试了这个例子,但没有成功。没有要导入的名为 CountDownRunner 的库。

我是 android 开发的新手,但是我在 Java、C、C++ 方面有相当好的经验。

谢谢

【问题讨论】:

标签: android


【解决方案1】:

这是我使用android原生DigitalClock.java和AnalogClock.Java类中使用的方法开发的一个简单时钟。这个时钟支持每秒或每分钟触发的事件,所以你可以使用这些事件并运行您的代码。

  1. StartTickPerSecond() 方法使用 DigitalClock.java 中使用的方法来获取每秒滴答声。
  2. StartTickPerMinute() 方法使用 AnalogClock.java 中使用的方法来获取每分钟的滴答声

这仍然可能需要一些修改..但希望这将是你开始的东西..

Clock.java

package com.sample.data;

import java.util.*;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
import android.os.SystemClock;
import android.text.format.Time;
public class Clock 
{
    public static final int TICKPERSECOND=0;
    public static final int TICKPERMINUTE=1;

    private Time Time;
    private TimeZone TimeZone;
    private Handler Handler;
    private List<OnClockTickListner> OnClockTickListenerList = new ArrayList<OnClockTickListner>();

    private Runnable Ticker;

    private  BroadcastReceiver IntentReceiver;
    private IntentFilter IntentFilter;

    private int TickMethod=0;
    Context Context;

    public Clock(Context context)
    {
        this(context, Clock.TICKPERMINUTE); 
    }
    public Clock(Context context,int tickMethod)
    {
        this.Context=context;
        this.TickMethod=tickMethod;
            this.Time=new Time();
        this.Time.setToNow();

        switch (TickMethod)
        {
            case 0:
                this.StartTickPerSecond();
                break;
            case 1:
                this.StartTickPerMinute();
                break;

            default:
                break;
        }
    }
    private void Tick(long tickInMillis)
    {
        Clock.this.Time.set(Clock.this.Time.toMillis(true)+tickInMillis);
        this.NotifyOnTickListners();
    }
    private void NotifyOnTickListners()
    {
        switch (TickMethod)
        {
            case 0:
                for(OnClockTickListner listner:OnClockTickListenerList)
                {
                    listner.OnSecondTick(Time);
                }
                break;
            case 1:
                for(OnClockTickListner listner:OnClockTickListenerList)
                {
                    listner.OnMinuteTick(Time);
                }
                break;
        }

    }
    private void StartTickPerSecond()
    {
        this.Handler=new Handler();
        this.Ticker = new Runnable() 
        {
            public void run() 
            {           
                Tick(1000);
                long now = SystemClock.uptimeMillis();
                long next = now + (1000 - now % 1000);           
                Handler.postAtTime(Ticker, next);             
            }
        };
        this.Ticker.run();

    }
    private void StartTickPerMinute()
    {
        this.IntentReceiver= new BroadcastReceiver() 
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
               Tick(60000);

            }
        };
        this.IntentFilter = new IntentFilter();
        this.IntentFilter.addAction(Intent.ACTION_TIME_TICK);
        this.Context.registerReceiver(this.IntentReceiver, this.IntentFilter, null, this.Handler);

    }
     public void StopTick()
     {
         if(this.IntentReceiver!=null)
         {
             this.Context.unregisterReceiver(this.IntentReceiver);
         }
         if(this.Handler!=null)
         {
             this.Handler.removeCallbacks(this.Ticker);
         }
     }
     public Time GetCurrentTime()
     {
         return this.Time;
     }
    public void AddClockTickListner(OnClockTickListner listner) 
    {
        this.OnClockTickListenerList.add(listner);

    }

}

OnClockTickListner.java

public interface OnClockTickListner {
    public void OnSecondTick(Time currentTime);
    public void OnMinuteTick(Time currentTime);
}

如何使用

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.clock_list_item);
        Clock c=new Clock(this);
        c.AddClockTickListner(new OnClockTickListner() {

            @Override
            public void OnSecondTick(Time currentTime) {
                Log.d("Tick Test per Second",DateFormat.format("h:mm:ss aa ", currentTime.toMillis(true)).toString());

            }

            @Override
            public void OnMinuteTick(Time currentTime) {
                Log.d("Tick Test per Minute",DateFormat.format("h:mm aa", currentTime.toMillis(true)).toString());

            }
        });

    }


}

【讨论】:

    【解决方案2】:

    查看DigitalClock 小部件的源代码。特别是,查看 onAttachedToWindow() 方法,它创建了一个 Runnable 来处理 1 秒的“滴答声”。

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      相关资源
      最近更新 更多