我在我的应用程序ActivityA和ActivityB中有2个活动和一个倒数计时器。计时器应该在两个活动之间继续运行。如果用户点击home或back按钮,计时器将被保存到数据库,然后将从应用程序重新启动时的最后一个状态继续。倒计时计时器问题
我在onPuse()和onBackPressed()中保存到数据库。用户点击主页和后退按钮时保存数据。
我的问题是:如果从ActivityA调用ActivityB,那么将调用保存到数据库方法。除非按下主页按钮,否则我怎样才能避免它被调用?
我在我的应用程序ActivityA和ActivityB中有2个活动和一个倒数计时器。计时器应该在两个活动之间继续运行。如果用户点击home或back按钮,计时器将被保存到数据库,然后将从应用程序重新启动时的最后一个状态继续。倒计时计时器问题
我在onPuse()和onBackPressed()中保存到数据库。用户点击主页和后退按钮时保存数据。
我的问题是:如果从ActivityA调用ActivityB,那么将调用保存到数据库方法。除非按下主页按钮,否则我怎样才能避免它被调用?
创建计时器后,将创建时间存储在数据库中,然后在每个活动onResume中重新加载计时器,从当前时间开始 - 创建时间。像这样的伪代码
createTimer() {
createTimerEntryInDB();
showTimer();
}
showTimer() {
fetchTimerEntryFromDB();
populateTimerUI();
}
/* In both activity */
onResume() {
if (doesTimerExistInDB) {
showTimer();
}
}
而不是两个活动之间的一个计时器,为什么不为每个活动使用单独的计时器和数据库条目,然后检查它们的总和是否超过限制。
将计时器的值传递给ActivityB
。当返回到ActivityA
时,发送定时器的值并从该值开始重新开始。不要忘记在开始新的意图之前停下来并保存。
您还可以创建一个服务,并绑定每项活动给它的东西,然后揭露一些普遍约束力的方法来访问定时器和操纵它按照自己的喜好。
当您关闭应用程序时会解除绑定活动,并且服务将默认自行停止。
正如我理解你的问题,如果从ActivityA
调用ActivityB
,你不想保存在数据库中的倒数状态。但在其他任何情况下,你想保存它。
一个相当简单的解决方案包括使用串行化标记:
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
以下方式应用类似的逻辑:
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
之间进行切换之外,还会执行其他任何操作,倒数保存在数据库中。否则它不是。
保持定时器在交换过程中运行不是问题,也不是从数据库内容初始化定时器。由于这里似乎不是你的问题,请告诉我你是否希望我详细说明这一点。
如果您按下A中的Home,则它会回到Home中,除非您覆盖Home Button按下事件来触发B – Rasel
每次活动变为“隐藏”时,都会自动调用onPause(),因此每次按下后按钮。顺便说一句,强烈建议不要重写主页按钮事件。 – iDroid
@iDroid其实它不可能覆盖主页按钮 – inazaruk