如何从一个活动启动计时器并从另一个活动停止?

时间:2016-10-20 10:25:29

标签: android timer timertask

我想从一个继续运行的类中启动一个Timer,直到我从其他类停止它。为了这, 我已经为名为startTimer和stopTimer的计时器和方法创建了类,如下所示:

public class TimerTaskClass extends Application {
Timer timer = new Timer();

public static final int TIME_INTERVAL = 10000;

public void startTimer(final Context context) {

    Log.d("Constants", "Timer Started");
        timer.scheduleAtFixedRate(new java.util.TimerTask() {

            @SuppressLint("DefaultLocale")
            @Override
            public void run() {

             //Performing my Operations

            }
        }, 0, TIME_INTERVAL);

}



public void stopTimer() {
    timer.cancel();
}

我正在做的是,我有两个活动ClassA和ClassB

 Class A{

  onCreate(){
     TimerTaskClass tmClass=new TimerTaskClass();
     tmClass.startTimer();
  }


 }

  Class B{

  onCreate(){
     TimerTaskClass tmClass=new TimerTaskClass();
     tmClass.stopTimer();
  }


 }

但这并没有阻止我从ClassA开始的计时器。如何做到这一点?

4 个答案:

答案 0 :(得分:2)

也许您可以将TimerTaskClass更改为单例,因此在这两个活动中您将使用相同的TimerTaskClass实例,它应该可以解决您的问题。

public class TimerTaskClass 
{
    private static TimerTaskClass _instance;

    private TimerTaskClass ()
    {

    }

    public synchronized static TimerTaskClass getInstance()
    {
        if (_instance == null)
        {
            _instance = new TimerTaskClass ();
        }
        return _instance;
    }
}

答案 1 :(得分:1)

TimerTaskClass延长Application。这是可能的,尽管它可能不是每种情况下的最佳解决方案,请参阅documentation。要使用此方法,您还必须在android:name中为application设置Manifest.xml属性:

<application
    android:name=".TimerTaskClass"
    ...keep the rest like before...
>
    ... keep this part unchanged as well ...
</application>

现在,只要您的应用启动,TimerTaskClass就会立即生效。

您可以按照以下Activity来访问它:

TimerTaskClass ttc = (TimerTaskClass)getApplication();

timer将被创建为Application实例的成员(默认情况下为Singleton),因此只有一个实例。所以你可以按如下方式启动它:

ttc.startTimer(getApplicationContext());

如果您认为使用自己的Application对象不是您想要的,我认为@Thror的答案将是最好的方法。在这种情况下,你当然不应该让TimerTaskClass继承Application - 它不会有用,甚至可能会导致问题。

答案 2 :(得分:0)

问题是,活动A和活动B都创建了自己的TimerTaskClass实例。相反,他们应该共享一个实例。

最简单的方法是将TimerTaskClass实现为Singleton,以便两个活动都可以与同一个类实例进行通信。

请注意,过度使用Singleton模式会导致难以跟踪和修复的错误。只要没有多个组件同时在你的单身人士上调用方法,你应该是安全的。

答案 3 :(得分:0)

为此你必须创建单身如下

public class TimerTaskClass {
    Timer timer = new Timer();
    public static final int TIME_INTERVAL = 10000;

  public void startTimer(final Context context) {

   Log.d("Constants", "Timer Started");
    timer.scheduleAtFixedRate(new java.util.TimerTask() {

        @SuppressLint("DefaultLocale")
        @Override
        public void run() {

         //Performing my Operations

        }
    }, 0, TIME_INTERVAL);

  }
public void stopTimer() {
  timer.cancel();
}

现在在Activity中你必须这样做

TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();

并在第二个活动中

 TimerTaskClass tmClass=new TimerTaskClass();
 tmClass.stopTimer();

希望您理解这个概念