Android Chronometer,保留时间状态(并在后台继续计数)

CQM*_*CQM 5 android chronometer android-service android-lifecycle android-activity

我有一个计时器,从用户遇到该活动开始计时

我目前在onCreate期间使用计时器设置(最初仅在满足某些条件时启动).但我需要计时器继续向上计数,直到应用程序及其所有视图都关闭(我有一个"退出"功能来执行此操作).

问题是,每次我查看另一个标签并返回其活动时,计时器会重置为零.(这与oncreate有关,但我不知道它的方式)

我没有找到一种直观的方法来自行保存天文台的状态或计数(或者可能跟踪我自己的时间并在不同的时间点直观地更新天文台)

我的一个想法是使用服务启动Chronometer并让服务继续计数,同时在现有活动更新中使用计时器的当前时间计数作为字符串进行文本视图

任何关于这个问题的已知方法的见解将不胜感激!

这更复杂,因为这是tabhost中的活动,并且每次加载视图时tabhost都会调用onPause和onResume,因此这会破坏生命周期功能.

Fuz*_*gic 6

有很多方法可以保持时间.我发现的最简单的方法是将时间存储在用于创建原始活动的Intent中getIntent().putExtra("START_TIME", floatvalue).您可以使用检索值getIntent().getFloatExtra("START_TIME", 0f).这样做有很多好处:

  • 它不会破坏Activity LifeCycle并且不需要Context.
  • 它可以在其他活动和Applicaitons之间轻松传递.
  • 它在Pauses和Stops中持续存在.
  • 它不需要特殊的听众.
  • 它不会创建任何新对象(Intent是第一次用于创建Activity的对象).

此解决方案非常适合持久保存在选项卡式活动中,或跨越对话框等.如果将应用程序留给内存更密集的应用程序,则会有一些限制,但仅限于您的活动被销毁(由于内存).


CQM*_*CQM 5

由于我的Tabhost,无法依赖生命周期功能.

我所做的是让计时器在中心类中成为静态全局,并ontabchangedlistener在我的tabhost中添加了一个检查以查看更改的选项卡是否是带有计时器的选项卡.如果这是真的,那么它存储计时器当前时间的Long值.

 tabHost.setOnTabChangedListener(new OnTabChangeListener(){

        @Override
        public void onTabChanged(String arg0) {
            // TODO Auto-generated method stub
            if(arg0.contentEquals("homeGroup"))
            {
                //store time in centralhelper.java
                                    //stopWatch is of type Chronometer
                                    //stopWatchLastTime is of type Long and is initially set to zero. Chronometer uses milliseconds to determine time, will never be zero after set
                CentralHelper.stopWatchLastTime = CentralHelper.stopWatch.getBase();
            }
        }

    });
Run Code Online (Sandbox Code Playgroud)

当我的homeGroup视图加载时,调用onResume()函数,这里有一个条件来检索计时器重新开始计数的时间.尽管tabhost将在正常生命周期函数之外的每个负载中调用onPause()和onResume(),但仍然会在onCreate()之前调用它们

   public void onResume(){
    super.onResume();

    //update Chronometer with time stored in tabchangelistener
    if(CentralHelper.stopWatchLastTime!=0)
        CentralHelper.stopWatch.setBase(CentralHelper.stopWatchLastTime);
}
Run Code Online (Sandbox Code Playgroud)

这让我在onCreate()上做了类似的检查

    if(CentralHelper.stopWatchLastTime!=0)
    {

        CentralHelper.stopWatch.start(); //this is where it resumes counting from the base set in onResume()
    }
    else
    {
        CentralHelper.stopWatch.start();
        CentralHelper.stopWatch.setBase(SystemClock.elapsedRealtime());
    }
Run Code Online (Sandbox Code Playgroud)