如何从一个 Activity 启动定时器并从另一个 activity 停止?

How to Start Timer from One Activity and Stop from another activity?

我想从 class 开始一个定时器,它会持续 运行 直到我从另一个 class 停止它。为了这, 我已经为定时器和名为 startTimer 和 stopTimer 的方法创建了 class,如下所示:

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

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

 Class A{

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


 }

  Class B{

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


 }

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

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

最简单的方法是将 TimerTaskClass 实现为 Singleton,这样两个活动就可以与 class 的同一个实例对话。

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

也许您可以将 TimerTaskClass 更改为单例,这样在这两个活动中您将使用相同的 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();
}

现在 Activity 你必须这样做

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

第二个 Activity

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

希望你理解这个概念

您的 TimerTaskClass 扩展 Application。这是可能的,尽管它可能不是所有情况下的最佳解决方案,请参阅 documentation。要遵循这种方法,您还必须在 Manifest.xml:

中为 application 设置 android:name 属性
<application
    android:name=".TimerTaskClass"
    ...keep the rest like before...
>
    ... keep this part unchanged as well ...
</application>

现在,TimerTaskClass 将在您的应用启动后立即实例化。

您可以像这样从每个 Activity 访问它:

TimerTaskClass ttc = (TimerTaskClass)getApplication();

timer 将创建为 Application 实例(默认情况下为单例)的成员,因此只有一个实例。所以你可以这样启动它:

ttc.startTimer(getApplicationContext());

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