Android:天文台作为持久秒表.如何设定开始时间?什么是天文台"基地"?

San*_*ago 8 android chronometer

我确实有一个服务在后台运行.每当它开始时,我在内存中存储起始时间(以毫秒为单位):

startingTime = new Date().getTime();
Run Code Online (Sandbox Code Playgroud)

我想显示一个计时器,它在服务启动时开始计数,并且在用户按下按钮之前永远不会停止.我想让用户离开活动渲染计时器,做一些事情,然后返回.但想法是,当用户返回时,我不希望计时器再次进入0:00.Insted我希望它显示自服务启动以来的确切时间.

每次用户返回计时器活动时,我都可以计算elapsedTime:

elapsedTime =  new Date().getTime() - startingTime;
Run Code Online (Sandbox Code Playgroud)

问题是,我不知道如何告诉计时器从那个时候开始计数!

将其设置为计时器基座不起作用.有人可以解释一下究竟"基础"意味着什么或如何实现这一目标?

非常感谢!BYE

Mac*_*rse 21

你可以使用天文台表.

您还应该检查此线程.

编辑:解决方案:

public class ChronoExample extends Activity {
 Chronometer mChronometer;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);

     LinearLayout layout = new LinearLayout(this);
     layout.setOrientation(LinearLayout.VERTICAL);

     mChronometer = new Chronometer(this);

     // Set the initial value
     mChronometer.setText("00:10");
     layout.addView(mChronometer);

     Button startButton = new Button(this);
     startButton.setText("Start");
     startButton.setOnClickListener(mStartListener);
     layout.addView(startButton);

     Button stopButton = new Button(this);
     stopButton.setText("Stop");
     stopButton.setOnClickListener(mStopListener);
     layout.addView(stopButton);

     Button resetButton = new Button(this);
     resetButton.setText("Reset");
     resetButton.setOnClickListener(mResetListener);
     layout.addView(resetButton);        

     setContentView(layout);
 }

 private void showElapsedTime() {
     long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();            
     Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, 
             Toast.LENGTH_SHORT).show();
 }

 View.OnClickListener mStartListener = new OnClickListener() {
     public void onClick(View v) {
      int stoppedMilliseconds = 0;

         String chronoText = mChronometer.getText().toString();
         String array[] = chronoText.split(":");
         if (array.length == 2) {
           stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000
               + Integer.parseInt(array[1]) * 1000;
         } else if (array.length == 3) {
           stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 
               + Integer.parseInt(array[1]) * 60 * 1000
               + Integer.parseInt(array[2]) * 1000;
         }

         mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds);
         mChronometer.start();
     }
 };

 View.OnClickListener mStopListener = new OnClickListener() {
     public void onClick(View v) {
         mChronometer.stop();
         showElapsedTime();
     }
 };

 View.OnClickListener mResetListener = new OnClickListener() {
     public void onClick(View v) {
         mChronometer.setBase(SystemClock.elapsedRealtime());
         showElapsedTime();
     }
 };
}
Run Code Online (Sandbox Code Playgroud)


小智 7

要启动天文钟,您应该将天文钟的setBase()方法与配合使用SystemClock.elapsedRealTime()。像这样:

mChronometer.setBase(SystemClock.elapsedRealTime())
Run Code Online (Sandbox Code Playgroud)

但是,如果要在其他时间开始,则必须减去所需的时间(以毫秒为单位)。例如,您想在10秒时启动计时器:

mChronometer.setBase(SystemClock.elapsedRealTime() - 10*1000);
Run Code Online (Sandbox Code Playgroud)

2分钟后:

mChronometer.setBase(SystemClock.elapsedRealTime() - 2*60*1000);
Run Code Online (Sandbox Code Playgroud)

但是这里的问题是,计时码表将在开始计时之前显示“ 00:00”,要更改为您的时间,您必须这样做:

mChronometer.setText("02:00");
Run Code Online (Sandbox Code Playgroud)


Gra*_*can 5

基准时间是Chronometer开始滴答的时间。您可以使用Chronometer.setBase(). 您应该使用SystemClock.getElapsedTime(). setBase()每次启动时调用开始时间Chronometer。如果有潜在的Activity被破坏和重建,而计时器仍处于活动状态,那么你将需要持有的基本时间之外的某个地方Activity拥有的Chronometer