Как сохранить значение таймера?
Я начинающий. Нужно сохранять Textview todo (задание) и Textview chronometer (значение таймера обратного отсчёта). Задание сохраняется, а вот с таймером что-то не получается. Или как ещё можно осуществить сохранение значения, чтобы после закрытия и нового открытия приложения таймер продолжался. Как это осуществить? В чём ошибка?
Код:
package game.doit;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.text.Layout;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
public class StartGame extends AppCompatActivity {
long duration = TimeUnit.HOURS.toMillis(24);
final String TAG = "STATE";
private long backPressedTime;
public static Toast backToast;
static SharedPreferences save;
CountDownTimer timer;
public static final String APP_PREFERENCES = "save";
public static final String APP_PREFERENCES_TODO = "todo";
public static final String APP_PREFERENCES_CHRONOMETER = "chronometer";
Context context;
@RequiresApi(api = Build.VERSION_CODES.N)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.start_game);
context = this;
//Массив
String[] tasks = {"Не спать всю ночь", "Здоровайся с каждым прохожим", "Проведи день с родителями", "Выучи 10 новых иностранных слов",
"Придумай 5 своих слов", "Улыбайся окружающим", "Пробежать 3 километра", "Сделай только 2 приёма пищи",
"Сделай генеральную уборку дома", "Забудь про телефон на 24 часа", "Приготовь пирог", "Разговаривай на иностранном языке", "Придумай подробный сюжет для фильма"};
// Вычисляем, сколько слов в массиве
int tasksLength = tasks.length;
//Генерируем случайные числа
int rand = (int) (Math.random() * tasksLength);
//Ставим задачу
String task = tasks[rand] + " ";
TextView todo = (TextView) findViewById(R.id.todo);
todo.setText(task);
//Button BACK
Window w = getWindow();
w.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Button buttonBack = findViewById(R.id.buttonBack);
buttonBack.setOnClickListener(v -> {
try {
Intent intent = new Intent(StartGame.this, MainActivity.class);
startActivity(intent);
finish();
} catch (Exception e) {
}
});
//
//CountDownTimer
TextView chronometer = (TextView) findViewById(R.id.chronometer);
CountDownTimer timer = new CountDownTimer(duration, 1000) {
@Override
public void onTick(long l) {
String duration1 = String.format(Locale.ENGLISH, "%02d : %02d : %02d",
TimeUnit.MILLISECONDS.toHours(l), TimeUnit.MILLISECONDS.toMinutes(l) -
TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toHours(l)), (l/1000)%60 );
chronometer.setText(duration1);
}
@Override
public void onFinish() {
try {
Intent intent = new Intent(StartGame.this, EndGame.class);
startActivity(intent);
finish();
} catch (Exception e) {
}
}
};
timer.start();
loadText();
}
//System button Back
@Override
public void onBackPressed() {
super.onBackPressed();
try {
Intent intent = new Intent(StartGame.this, MainActivity.class);
startActivity(intent);
finish();
} catch (Exception e) {
}
}
//
void saveText () {
TextView todo = (TextView) findViewById(R.id.todo);
TextView chronometer = (TextView) findViewById(R.id.chronometer);
SharedPreferences save = StartGame.this.getSharedPreferences("save", MODE_PRIVATE);
SharedPreferences.Editor editor = save.edit();
editor.putString(APP_PREFERENCES_CHRONOMETER, chronometer.getText().toString());
editor.putString(APP_PREFERENCES_TODO, todo.getText().toString());
editor.apply();
}
void loadText () {
TextView todo = (TextView) findViewById(R.id.todo);
TextView chronometer = (TextView) findViewById(R.id.chronometer);
SharedPreferences save = StartGame.this.getSharedPreferences("save", MODE_PRIVATE);
chronometer.setText(save.getString(APP_PREFERENCES_CHRONOMETER, chronometer.getText().toString()));
todo.setText(save.getString(APP_PREFERENCES_TODO, todo.getText().toString()));
}
@Override
protected void onPause() {
super.onPause();
saveText();
Log.d(TAG, "onPause");
}
@Override
protected void onStop() {
saveText();
super.onStop();
Log.d(TAG, "onDestroy");
}
@Override
protected void onResume() {
super.onResume();
loadText();
Log.d(TAG, "onResume");
}
@Override
protected void onDestroy() {
super.onDestroy();
saveText();
Log.d(TAG, "onDestroy");
}
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
TextView todo = (TextView) findViewById(R.id.todo);
TextView chronometer = (TextView) findViewById(R.id.chronometer);
outState.putString("chronometer", chronometer.getText().toString());
outState.putString("todo", todo.getText().toString());
Log.d(TAG, "onSaveInstanceState");
}
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
TextView todo = (TextView) findViewById(R.id.todo);
TextView chronometer = (TextView) findViewById(R.id.chronometer);
chronometer.setText(savedInstanceState.getString("chronometer"));
todo.setText(savedInstanceState.getString("todo"));
Log.d(TAG, "onRestoreInstanceState");
}
}
Ответы (1 шт):
При сохранении задачи учитывай время на которое она сохраняется, а не какое осталось. Я бы сделал так При сохранении задачb ставил бы такое время System.getcurrenttimemillis() + (время на выполнение задачи в миллисекундах), пусть это будет переменная endOfTask. Потом при повторном запуске приложения время на таймере я бы считал так: endOfTask - System.getcurrenttimemillis()