我的应用程序ActivityA和ActivityB中有2个活动和倒计时器。计时器应该在两个活动之间保持运行。如果用户单击主页或后退按钮,计时器将保存到数据库,然后将在应用程序重新启动时从最后一个状态继续。
我在onPuse()和onBackPressed()中保存到数据库。如果用户点击主页和后退按钮,则保存数据。
我的问题是:如果从ActivityA调用ActivityB,则将调用save to database方法。除非按下主页按钮,否则如何避免被调用?
答案 0 :(得分:4)
创建计时器后,将创建时间存储在数据库中,然后在每个活动中onResume从当前时间 - 创建时间开始重新加载计时器。像这个伪造的代码
createTimer() {
createTimerEntryInDB();
showTimer();
}
showTimer() {
fetchTimerEntryFromDB();
populateTimerUI();
}
/* In both activity */
onResume() {
if (doesTimerExistInDB) {
showTimer();
}
}
答案 1 :(得分:3)
你也可以创建一个服务并将每个活动绑定到它,然后公开一些通用的绑定方法来访问计时器并按照你的意愿操纵它。
当你关闭应用程序时,取消绑定活动,默认情况下服务将自行停止。
答案 2 :(得分:1)
为什么不为每个活动使用单独的计时器和数据库条目,而不是在两个活动之间使用一个计时器,然后检查它们的总和是否超过限制。
答案 3 :(得分:1)
将计时器的值传递给ActivityB
。当返回ActivityA
发送计时器的值并从该值重新开始时。不要忘记在开始新意图之前停止并保存。
答案 4 :(得分:1)
正如我理解你的问题,如果从ActivityB
调用ActivityA
,你不希望在数据库中保存倒计时的状态。但在任何其他情况下,你都想保存它。
一个非常简单的解决方案是使用序列化标志:
ActivityA
:
public class ActivityA extends Activity {
private boolean serializationIsEnabled = true; // The flag
...
private void internalLogicOfYourActivity() {
...
// When ActivityA calls ActivityB, it disables the serialization of the timer
serializationIsEnabled = false;
startActivityForResult(new Intent(this, ActivityB.class), REQUEST_CODE);
...
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == REQUEST_CODE) {
// We'll be happy to have the serialization working again when we'll be back from ActivityB.
// A variant of this would be to reset serializationIsEnabled in onResume()
serializationIsEnabled = true;
...
}
}
@Override
protected void onPause() {
// Save the state of the timer if the serialization is enabled
if (serializationIsEnabled) {
saveCountDownInTheDatabase();
}
super.onPause();
}
@Override
public void onBackPressed() {
// it is not even needed to save the countdown here:
// onPause() will be called anyway if you press back.
super.onBackPressed();
}
}
ActivityB
:
public class ActivityB extends Activity {
...
@Override
protected void onPause() {
saveCountDownInTheDatabase();
super.onPause();
}
@Override
public void onBackPressed() {
// Same here: it is not needed to save the countdown:
// onPause() will be called anyway if you press back.
super.onBackPressed();
}
}
这样我们对你的问题很好。
如果您不希望在从ActivityB
返回ActivityA
时保存倒计时,则可以通过以下方式修改ActivityB
来应用类似的逻辑:< / p>
public class ActivityB extends Activity {
private boolean serializationIsEnabled = true; // The flag
...
private void finishWithResult(int result) {
serializationIsEnabled = false;
setResult(result);
finish();
}
private void internalLogicOfYourActivity() {
...
finishWithResult(RESULT_OK);
...
}
@Override
protected void onPause () {
if (serializationIsEnabled) {
saveCountDownInTheDatabase();
}
super.onPause();
}
@Override
public void onBackPressed() {
finishWithResult(RESULT_CANCELED);
super.onBackPressed();
}
}
这样,如果用户执行的操作不是在ActivityA
和ActivityB
之间切换,则倒计时将保存在数据库中。否则就不是。
在切换期间保持定时器运行不是问题,也不会从数据库内容初始化定时器。由于这似乎不是您的问题,请告诉我您是否希望我详细说明这一点。