2017-01-30 71 views
1

嗨,我最近做了一个简单的秒表应用程序,它工作正常。但是,当我切换屏幕并将其打开时,计时器会显示最后一次的时间值。例如,如果定时器显示给我00:00:10,则将(5秒钟)的屏幕重新打开并显示相同的值,并开始增加时间值。当屏幕关闭时,android stopwatch停止工作

任何建议为什么?

感谢

 if (savedInstanceState != null) { 
     seconds = savedInstanceState.getInt("seconds"); 
     running = savedInstanceState.getBoolean("running"); 
     wasRunning = savedInstanceState.getBoolean("wasRunning"); 
    } 

    runTimer(); 
} 


public void onClickStart(View view){ 
    running = true; 
} 

public void onClickStop(View view){ 
    running = false; 
} 

public void onClickReset(View view){ 
    running = false; 
    seconds = 0; 
} 


@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    savedInstanceState.putInt("seconds", seconds); 
    savedInstanceState.putBoolean("running", running); 
    savedInstanceState.putBoolean("wasRunning",wasRunning); 
} 


@Override 
protected void onPause(){ 
    super.onPause(); 
    wasRunning = running; 
    running = false; 
} 

@Override 
protected void onResume(){ 
    super.onResume(); 
    if(wasRunning){ 
     running = true; 
    } 
} 

@Override 
protected void onStop(){ 
    super.onStop(); 
    wasRunning = running; 
    running = false; 
} 

@Override 
protected void onStart(){ 
    super.onStart(); 
    if(wasRunning){ 
     running = true; 
    } 
} 

private void runTimer(){ 
    final TextView timeView = (TextView)findViewById(R.id.time_view); 
    final Handler handler = new Handler(); 

    handler.post(new Runnable() { 
     @Override 
     public void run() { 

      int hours = seconds/3600; 
      int minutes = (seconds%3600)/60; 
      int secs = seconds%60; 

      String time = String.format("%d:%02d:%02d",hours,minutes,secs); 
      timeView.setText(time); 

      if(running){ 
       seconds++; 
      } 
      handler.postDelayed(this,1000); 
     } 
    }); 

} 

回答

2
@Override 
protected void onPause(){ 
    super.onPause(); 
    wasRunning = running; 
    running = false; 
} 

@Override 
protected void onResume(){ 
    super.onResume(); 
    if(wasRunning){ 
     running = true; 
    } 
} 

@Override 
protected void onStop(){ 
    super.onStop(); 
    wasRunning = running; 
    running = false; 
} 

@Override 
protected void onStart(){ 
    super.onStart(); 
    if(wasRunning){ 
     running = true; 
    } 
} 

只要看着你的代码,你的running值更改为false,只要您的活动PausesStops。 并查看定时器,它只会增加值,如果runningtrue

+0

好,那么纠正我,如果我错了,为了保持秒表运行,而屏幕是或应用程序在后台我需要删除这些方法? – MariusBrave

+0

是的,你必须。但尝试使用'服务'.https://developer.android.com/guide/components/services.html –

+0

谢谢生病检查出 – MariusBrave

1

秒表应该在后台运行的服务中创建。您的活动只应读取并显示服务逻辑的时间。

现在,您的秒表会平移到活动生命周期线程,因此在您的活动/应用程序处于后台时停止计时。

请参阅here一个正确的实现示例。

+0

请帮我这个 - http:// stackoverflow。com/q/41928314/4614833 – Sinscary

0

尝试添加该权限在您的清单

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
0

为了保证双方时钟的一致性(你的问题 - 显示自启动以来的实际时间)和时钟精度(避免小累积误差),你只需要测量

然后在你的计时器度量上的差异:

// every now and then, get the current time and substract 
long now = System.currentTimeMillis(); 
seconds = (now - start)/1000; 
时间从开始时间已过

由于您的活动可能会被破坏并且会话数据丢失,因此您应该在SharedPreferences中保存并恢复您的开始时间。您不需要其他人建议的服务。

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

    // Restore preferences 
    SharedPreferences settings = getSharedPreferences(); 
    start = settings.getLong("start_time", 0); 
    if (start != 0) { 
     running = true; 
    } 
} 

@Override 
protected void onStop(){ 
super.onStop(); 
if (running) { 
    SharedPreferences settings = getSharedPreferences(); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putLong("start_time", startTime); 
    editor.apply(); 
} 

你可能会倾向于保存onSaveInstanceState()捆绑这些价值观 - 但这将被系统被破坏,如果你不使用的应用程序很长一段时间。 SharedPreferences是持久的,允许您测量任何长时间。

显然你需要在开始/停止秒表时刷新保存的startTime。你也可以保存布尔值,这将允许你保持startTime和endTime或timeElapsed;有很多方法可以实现这一点,但基本的想法是总是测量开始时间和现在(或停止时间)之间的时间差。

+0

请帮我解决这个问题 - http://stackoverflow.com/q/41928314/4614833 – Sinscary