倒数计时器问题

时间:2011-07-15 09:17:54

标签: android countdown

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

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

我的问题是:如果从ActivityA调用ActivityB,则将调用save to database方法。除非按下主页按钮,否则如何避免被调用?

5 个答案:

答案 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();
    }
}

这样,如果用户执行的操作不是在ActivityAActivityB之间切换,则倒计时将保存在数据库中。否则就不是。

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