当屏幕关闭时,android stopwatch停止工作
嗨,我最近做了一个简单的秒表应用程序,它工作正常。但是,当我切换屏幕并将其打开时,计时器会显示最后一次的时间值。例如,如果定时器显示给我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);
}
});
}
@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
,只要您的活动Pauses
或Stops
。 并查看定时器,它只会增加值,如果running
是true
。
尝试添加该权限在您的清单
<uses-permission android:name="android.permission.WAKE_LOCK" />
为了保证双方时钟的一致性(你的问题 - 显示自启动以来的实际时间)和时钟精度(避免小累积误差),你只需要测量
然后在你的计时器度量上的差异:
// 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;有很多方法可以实现这一点,但基本的想法是总是测量开始时间和现在(或停止时间)之间的时间差。
请帮我解决这个问题 - http://*.com/q/41928314/4614833 – Sinscary
好,那么纠正我,如果我错了,为了保持秒表运行,而屏幕是或应用程序在后台我需要删除这些方法? – MariusBrave
是的,你必须。但尝试使用'服务'.https://developer.android.com/guide/components/services.html –
谢谢生病检查出 – MariusBrave