从 onRestart 状态返回时如何在应用程序中继续计时器
how to continue timer in app when come back from onRestart state
我创建了一个记忆游戏的小应用程序。在该应用程序中,我创建了一个计时器,显示用户完成游戏所需的时间。我的问题是,在我转到另一个页面(如主屏幕)并返回游戏后,计时器冻结了——时间保持在停止的同时……(我知道它与 onRestarte() 方法有某种关系但不知道该怎么做..)我希望计时器在停止的同时继续。 (比如如果用户在游戏中途接到电话然后想继续)。
package com.example.kineret.memorygame;
public class Game4x4Activity extends AppCompatActivity implements View.OnClickListener{
TextView timerTextView;
long startTime = 0;
Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
@Override
public void run() {
long millis = System.currentTimeMillis() - startTime;
int seconds = (int) (millis / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
timerTextView.setText(String.format("%d:%02d", minutes, seconds));
timerHandler.postDelayed(this, 500);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game4x4);
timerTextView = (TextView) findViewById(R.id.timerTextView4x4);
}
@Override
public void onPause() {
super.onPause();
timerHandler.removeCallbacks(timerRunnable);
}
@Override
public void onClick(View view) {
if(newGame) {
startTime = System.currentTimeMillis();
timerHandler.postDelayed(timerRunnable, 0);
newGame = false;
}
// rest of my code...
}
如果用户接到 phone 电话,您的应用将调用 onPause
,然后如果他们完成 phone 电话并玩您的游戏,您的 activity 将收到 onResume
叫了。
在onPause
保存系统时间,在onResume
获取最新的系统时间。将它们彼此分开(在 onResume
中),您将获得用户不在您的应用中的时间,然后您可以在重新启动它之前将其添加到您的计时器中。
这次你可能还得坚持 onSaveInstanceState
在其他时候。
我已经编辑了你的代码。请试试这个
public class Game4x4Activity extends AppCompatActivity implements View.OnClickListener{
// make a new variable
static long elapsedTime = 0;
TextView timerTextView;
long startTime = 0;
Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
@Override
public void run() {
// change here
long millis = (System.currentTimeMillis() - startTime) + elapsedTime;
int seconds = (int) (millis / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
timerTextView.setText(String.format("%d:%02d", minutes, seconds));
timerHandler.postDelayed(this, 500);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game4x4);
timerTextView = (TextView) findViewById(R.id.timerTextView4x4);
}
@Override
public void onPause() {
// change here
elapsedTime = elapsedTime + (System.currentTimeMillis() - startTime);
timerHandler.removeCallbacks(timerRunnable);
super.onPause();
}
@Override
public void onResume() {
super.onResume();
// change here
if(!newGame) {
startTime = System.currentTimeMillis();
timerHandler.postDelayed(timerRunnable, 0);
}
}
我创建了一个记忆游戏的小应用程序。在该应用程序中,我创建了一个计时器,显示用户完成游戏所需的时间。我的问题是,在我转到另一个页面(如主屏幕)并返回游戏后,计时器冻结了——时间保持在停止的同时……(我知道它与 onRestarte() 方法有某种关系但不知道该怎么做..)我希望计时器在停止的同时继续。 (比如如果用户在游戏中途接到电话然后想继续)。
package com.example.kineret.memorygame;
public class Game4x4Activity extends AppCompatActivity implements View.OnClickListener{
TextView timerTextView;
long startTime = 0;
Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
@Override
public void run() {
long millis = System.currentTimeMillis() - startTime;
int seconds = (int) (millis / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
timerTextView.setText(String.format("%d:%02d", minutes, seconds));
timerHandler.postDelayed(this, 500);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game4x4);
timerTextView = (TextView) findViewById(R.id.timerTextView4x4);
}
@Override
public void onPause() {
super.onPause();
timerHandler.removeCallbacks(timerRunnable);
}
@Override
public void onClick(View view) {
if(newGame) {
startTime = System.currentTimeMillis();
timerHandler.postDelayed(timerRunnable, 0);
newGame = false;
}
// rest of my code...
}
如果用户接到 phone 电话,您的应用将调用 onPause
,然后如果他们完成 phone 电话并玩您的游戏,您的 activity 将收到 onResume
叫了。
在onPause
保存系统时间,在onResume
获取最新的系统时间。将它们彼此分开(在 onResume
中),您将获得用户不在您的应用中的时间,然后您可以在重新启动它之前将其添加到您的计时器中。
这次你可能还得坚持 onSaveInstanceState
在其他时候。
我已经编辑了你的代码。请试试这个
public class Game4x4Activity extends AppCompatActivity implements View.OnClickListener{
// make a new variable
static long elapsedTime = 0;
TextView timerTextView;
long startTime = 0;
Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {
@Override
public void run() {
// change here
long millis = (System.currentTimeMillis() - startTime) + elapsedTime;
int seconds = (int) (millis / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;
timerTextView.setText(String.format("%d:%02d", minutes, seconds));
timerHandler.postDelayed(this, 500);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game4x4);
timerTextView = (TextView) findViewById(R.id.timerTextView4x4);
}
@Override
public void onPause() {
// change here
elapsedTime = elapsedTime + (System.currentTimeMillis() - startTime);
timerHandler.removeCallbacks(timerRunnable);
super.onPause();
}
@Override
public void onResume() {
super.onResume();
// change here
if(!newGame) {
startTime = System.currentTimeMillis();
timerHandler.postDelayed(timerRunnable, 0);
}
}