2

我想制作一个计时器,它将显示在我的应用程序的每个活动中。

我知道如何在下面的活动上制作计时器是我的代码

public class Timer extends Activity implements OnClickListener {
    public TextView mTextField;
    private Button btnstart;

    public String formatTime(long millis) { 
        String output = "00:00"; 
        long seconds = millis / 1000; 
        long minutes = seconds / 60; 

        seconds = seconds % 60; 
        minutes = minutes % 60; 

        String secondsD = String.valueOf(seconds); 
        String minutesD = String.valueOf(minutes); 

        if (seconds < 10) 
            secondsD = "0" + seconds; 
        if (minutes < 10) 
            minutesD = "0" + minutes; 

        output = minutesD + " : " + secondsD; 
        return output; 
    } 
    public CountDownTimer Counter1;

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 

        //Declare Start/Stop button 
        btnstart = (Button)findViewById(R.id.btnThread1); 
        btnstart.setOnClickListener(this);
        //Button btnstop = (Button)findViewById(R.id.button02); 
        //Button btnpass = (Button)findViewById(R.id.button03);

        //Declare Text fields to show time left 
        final TextView mCounter1TextField=(TextView)findViewById(R.id.txtThread1); 
        final TextView mCounter2TextField = (TextView)findViewById(R.id.txtThread2); 
        //final TextView mCounter3TextField=(TextView)findViewById(R.id.textView03); 



        //Counter 1 
        Counter1 = new CountDownTimer(120000 , 1000) { 
            public void onTick(long millisUntilFinished) { 
                mCounter1TextField.setText("Seconds left: " + formatTime(millisUntilFinished)); 
            } 

            public void onFinish() { 
                mCounter1TextField.setText("Finished!"); 
                // Counter1.start();
            } 
        }; 
    }

    @Override
    public void onClick(View v) {
        if(v == btnstart)
        {
            Counter1.start();
        }

    }
}

我想知道如何让它全球化??

4

5 回答 5

2

你可以有一个单身班级持有你的CountDownTimer

// This is not a real singleton, Google to get a proper Java implementation
public class TimerSingleton {

  // Should not be public, you should of course encapsulate access to that timer.
  // static keyword says that one timer object is shared by all instance of TimerSingleton 
  public static CountDownTimer timer = new CountDownTimer();
}

// Access to the timer from an activity:
TimerSingleton.timer.start();

第二种选择是将您的计时器作为自定义应用程序类的成员:将应用程序类用于全局变量

第三个选项:创建一个在启动时启动计时器的本地服务。

请记住,在选项 1 和 2 的情况下,如果操作系统决定杀死您的应用程序,计时器将消失(即,当重新创建活动时,CountDownTimer 对象将被重置)。

于 2012-10-22T13:02:52.463 回答
1

创建一个单例!http://en.wikipedia.org/wiki/Singleton_pattern

单例保证只会有一个对象,并使任何其他对象都可以轻松访问它。

于 2012-10-22T13:02:07.717 回答
1

如果您想在应用程序的每个活动中显示它,那么我建议您使用Fragments。您需要做的就是使用您的 Timer 类创建一个每次都会出现的 Fragment,另一个带有您要显示的其他内容的 Fragment,并仅操纵第二个 Fragment 的生命周期。

于 2012-10-22T13:30:08.723 回答
1

我通过在一个活动中创建一个计时器并在我的另一个活动中调用它的受保护函数来解决我的问题。

这是启动定时器的 startTimer 函数:

private void startTimer(){ 
    if (mTimer == null) { 
        mTimer = new Timer(); 
    } 
    if (mTimerTask == null) { 
        mTimerTask = new TimerTask() { 
            @Override 
            public void run() { 
                Log.i(TAG, "count: "+String.valueOf(count)); 
                sendMessage(UPDATE_TEXTVIEW); 

                do { 
                    try { 
                        Log.i(TAG, "sleep(1000)..."); 
                        Thread.sleep(1000); 
                    } catch (InterruptedException e) { 
                    }    
                } while (isPause);  
                count ++;   
            } 
        }; 
    } 
    if(mTimer != null && mTimerTask != null ) 
        mTimer.schedule(mTimerTask, delay, period); 
} 

这是任何其他活动都可以使用的公共功能:

public String valueOfTimer()
{
    return String.valueOf(count);
}

这就是我在其他活动中获得价值的方式:

private void updateTime()
{
    TimerActivity tm  = new TimerActivity();

    String time = tm.valueOfTimer();
    t2.setText(time);
    System.out.println("Time::"+time);
}
于 2012-10-23T08:42:26.773 回答
0

创建一个单例类并在您的 ui 中注册侦听器。

 mTimerCustom = CountdownTimer.getInstance();
 mTimerCustom.registerListener(this);
 mTimerCustom.start();

在 CountDownTimer 类中

 public static CountdownTimer getInstance()
    {
        return INSTANCE;
    }

 public synchronized void start() {

        Calendar cal=Calendar.getInstance();
        int seconds=cal.get(Calendar.SECOND);
       start=60-seconds;
        //Toast.makeText(mParentActivity,""+seconds,Toast.LENGTH_LONG).show();
        if (D) Log.d(TAG, "start");
        switch (state) {
            case STOPPED:
                count = start;
            case PAUSED:
                timer = new Timer(TAG);
                timer.scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        if (count > 0) {
                            count--;
                            Log.d(TAG, "Tick: " + count);
                            for (TimerListener listener : listeners) {
                                listener.timerUpdate(count);
                            }
                        }
                        else stop();
                    }
                }, 0, DELAY);
                state = COUNTING;
                if (D) Log.d(TAG, "state: counting");
                break;
            case COUNTING:
                break;
            default:
                throw new IllegalStateException(state.toString());
        }
    }
于 2015-11-09T05:37:02.440 回答