activity 重新启动时秒表重置
Stopwatch resets when activity restarts
我正在尝试为我的统计数据创建简单的秒表 activity。它需要做的是在 activity 第一次创建时开始,然后计数并计数,直到我重置它。我使用的代码:
String trip_time;
long millis;
long start_time;
Handler Handler;
private boolean started = false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Handler.postDelayed(Runnable, 10L);
if (!started) {
start_time = System.currentTimeMillis();
started = true;
}
}
private final Runnable Runnable = new Runnable() {
@Override
public void run() {
millis = (System.currentTimeMillis() - start_time);
long seconds = millis / 1000;
trip_time = String.format(Locale.getDefault(), "%02d:%02d:%02d", seconds / 3600, seconds / 60, seconds % 60);
Handler.postDelayed(Runnable, 10L);
}
};
但是当我有意到达 activity 时,或者 activity 重新启动秒表重置并从 0 开始计数。几次重置后它继续从基本时间开始计数。我能以某种方式摆脱这个问题吗?可能通过 class 或其他方式。
以下代码每次都会重置秒表,因为当您返回此 activity 时,它将启动一个新的可运行程序并在 UI.
上显示
您需要能够连接到之前数据的东西。您可以使用 Service,它会在您每次 return 时绑定到此 activity,即使您的应用已从后台删除也是如此。或者您可以在 Shared Preferences / Datastore 上保存上次时间和经过时间,然后通过添加总经过时间来启动 activity 计时器。
谢谢,我通过制作 StopwatchService 解决了我的问题:
public class StopwatchService extends Service {
Handler Handler;
long start_time;
static String trip_time;
static long millis;
@Override
public void onCreate() {
super.onCreate();
Handler = new Handler();
Handler.postDelayed(Runnable, 10L);
start_time = System.currentTimeMillis();
}
private final Runnable Runnable = new Runnable() {
@Override
public void run() {
millis = (System.currentTimeMillis() - start_time);
long seconds = millis / 1000;
trip_time = String.format(Locale.getDefault(), "%02d:%02d:%02d", seconds / 3600, seconds / 60, seconds % 60);
Handler.postDelayed(Runnable, 10L);
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public static String getTrip_time(){return trip_time;}
}
清单中:
<service
android:name=".StopwatchService"
android:enabled="true"/>
在activity中:
startService(new Intent(this, StopwatchService.class));
String trip_time = StopwatchService.getTrip_time();
我正在尝试为我的统计数据创建简单的秒表 activity。它需要做的是在 activity 第一次创建时开始,然后计数并计数,直到我重置它。我使用的代码:
String trip_time;
long millis;
long start_time;
Handler Handler;
private boolean started = false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Handler.postDelayed(Runnable, 10L);
if (!started) {
start_time = System.currentTimeMillis();
started = true;
}
}
private final Runnable Runnable = new Runnable() {
@Override
public void run() {
millis = (System.currentTimeMillis() - start_time);
long seconds = millis / 1000;
trip_time = String.format(Locale.getDefault(), "%02d:%02d:%02d", seconds / 3600, seconds / 60, seconds % 60);
Handler.postDelayed(Runnable, 10L);
}
};
但是当我有意到达 activity 时,或者 activity 重新启动秒表重置并从 0 开始计数。几次重置后它继续从基本时间开始计数。我能以某种方式摆脱这个问题吗?可能通过 class 或其他方式。
以下代码每次都会重置秒表,因为当您返回此 activity 时,它将启动一个新的可运行程序并在 UI.
上显示您需要能够连接到之前数据的东西。您可以使用 Service,它会在您每次 return 时绑定到此 activity,即使您的应用已从后台删除也是如此。或者您可以在 Shared Preferences / Datastore 上保存上次时间和经过时间,然后通过添加总经过时间来启动 activity 计时器。
谢谢,我通过制作 StopwatchService 解决了我的问题:
public class StopwatchService extends Service {
Handler Handler;
long start_time;
static String trip_time;
static long millis;
@Override
public void onCreate() {
super.onCreate();
Handler = new Handler();
Handler.postDelayed(Runnable, 10L);
start_time = System.currentTimeMillis();
}
private final Runnable Runnable = new Runnable() {
@Override
public void run() {
millis = (System.currentTimeMillis() - start_time);
long seconds = millis / 1000;
trip_time = String.format(Locale.getDefault(), "%02d:%02d:%02d", seconds / 3600, seconds / 60, seconds % 60);
Handler.postDelayed(Runnable, 10L);
}
};
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
public static String getTrip_time(){return trip_time;}
}
清单中:
<service
android:name=".StopwatchService"
android:enabled="true"/>
在activity中:
startService(new Intent(this, StopwatchService.class));
String trip_time = StopwatchService.getTrip_time();