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

Android 如何从一个活动启动计时器,从另一个活动停止计时器?,android,timer,timertask,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 cont

我想从一个类启动一个计时器,它将一直运行,直到我从另一个类停止。为此,, 我已经为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();
}
我现在做的是,我有两个活动类别A和类别B

 Class A{

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


 }

  Class B{

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


 }

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

问题在于活动A和活动B各自创建自己的
TimerTaskClass
实例。相反,它们应该共享一个实例

最简单的方法是将
TimerTaskClass
实现为一个类,这样两个活动都可以与该类的同一个实例通信


请注意,过度使用单例模式会导致难以跟踪和修复的bug。只要没有太多组件同时在您的singleton上调用方法,您就应该是安全的。

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

public class TimerTaskClass 
{
    private static TimerTaskClass _instance;

    private TimerTaskClass ()
    {

    }

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

为此,您必须创建如下单例

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();
}
现在在活动中,你必须这样做

TimerTaskClass tmClass=new TimerTaskClass();
tmClass.startTimer();
在第二个活动中

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

希望您理解您的
TimerTaskClass
扩展
应用程序的概念。这是可能的,尽管它可能不是所有情况下的最佳解决方案,请参阅。要使用这种方法,还必须在
Manifest.xml
中为
应用程序设置
android:name
属性:

<application
    android:name=".TimerTaskClass"
    ...keep the rest like before...
>
    ... keep this part unchanged as well ...
</application>
计时器
将被创建为
应用程序
实例(默认情况下为单例)的成员,因此它只有一个实例。因此,您可以按如下方式启动它:

ttc.startTimer(getApplicationContext());

如果您决定使用自己的
应用程序
对象不是您想要的,我认为@Thror的答案将是最好的选择。顺便说一句,在这种情况下,您当然不应该让
TimerTaskClass
应用程序
继承-这将不会有用,甚至可能会导致问题。

尝试使用带有活动的片段来在秒内设置计时器activity@Shane谢谢你的回答。但我有活动,把它变成碎片对我来说将是一个巨大的改变(.还有其他方法吗?@Nikung Ty用于回复。你能给我一个例子吗?为什么让TimerTaskClass扩展应用程序?你是否也在清单中做了必要的更改以真正将其用作应用程序(set
android:name
attribute)?我正在尝试这个。Ty用于回答。我认为这是一个明智的解决方案!!!因为他在为启动和停止函数创建单独的实例时需要相同的实例!!!感谢Thanx让我知道它们的区别。我已经采用了Thror解决方案。@Rahul-我认为这确实是最好的选择。请不要忘记接受Thror的回答(单击投票下面的灰色复选标记)。
ttc.startTimer(getApplicationContext());