2011-07-15 259 views
3

我在我的应用程序ActivityA和ActivityB中有2个活动和一个倒数计时器。计时器应该在两个活动之间继续运行。如果用户点击home或back按钮,计时器将被保存到数据库,然后将从应用程序重新启动时的最后一个状态继续。倒计时计时器问题

我在onPuse()和onBackPressed()中保存到数据库。用户点击主页和后退按钮时保存数据。

我的问题是:如果从ActivityA调用ActivityB,那么将调用保存到数据库方法。除非按下主页按钮,否则我怎样才能避免它被调用?

+0

如果您按下A中的Home,则它会回到Home中,除非您覆盖Home Button按下事件来触发B – Rasel

+2

每次活动变为“隐藏”时,都会自动调用onPause(),因此每次按下后按钮。顺便说一句,强烈建议不要重写主页按钮事件。 – iDroid

+2

@iDroid其实它不可能覆盖主页按钮 – inazaruk

回答

4

创建计时器后,将创建时间存储在数据库中,然后在每个活动onResume中重新加载计时器,从当前时间开始 - 创建时间。像这样的伪代码

createTimer() { 
    createTimerEntryInDB(); 
    showTimer(); 
} 

showTimer() { 
    fetchTimerEntryFromDB(); 
    populateTimerUI(); 
} 

/* In both activity */ 
onResume() { 
    if (doesTimerExistInDB) { 
     showTimer(); 
    } 
} 
+0

这是正确的做法。不要忘记onPause(){storeTimer();}虽然。另外,在您致电onResume时,您的计时器可能已过期。如果您按Home键,等待足够的时间,然后重新输入您的应用程序(通过长按Home键),则可能会发生这种情况。因此,请确保在onResume中仔细检查数据库中的计时器值,以确保您不会受到负面影响。 – Josh

+0

我想它一旦存储在数据库中就没有必要在onPause中恢复它,但是需要检查它是否过期以及是否它过期了,它需要从数据库中刷新。 – PravinCG

+0

哦,是的,你是对的,当你创造它时,你保存了原作! – Josh

1

而不是两个活动之间的一个计时器,为什么不为每个活动使用单独的计时器和数据库条目,然后检查它们的总和是否超过限制。

1

将计时器的值传递给ActivityB。当返回到ActivityA时,发送定时器的值并从该值开始重新开始。不要忘记在开始新的意图之前停下来并保存。

3

您还可以创建一个服务,并绑定每项活动给它的东西,然后揭露一些普遍约束力的方法来访问定时器和操纵它按照自己的喜好。

当您关闭应用程序时会解除绑定活动,并且服务将默认自行停止。

1

正如我理解你的问题,如果从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(); 
    } 
} 

这样,如果用户除了在ActivityAActivityB之间进行切换之外,还会执行其他任何操作,倒数保存在数据库中。否则它不是。

保持定时器在交换过程中运行不是问题,也不是从数据库内容初始化定时器。由于这里似乎不是你的问题,请告诉我你是否希望我详细说明这一点。