0

我的应用程序中有很多活动(例如 A->B->C->D)...我有一个用于会话超时的倒数计时器。我所做的是创建了一个静态计数器...我在活动 A 处启动计数器......如果用户交互计数器被重置......这也适用于活动 B、C、D....同样在完成活动 D 时,活动 A 开始......为此我已经使用addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)所以它清除堆栈...

但是当活动 A 再次启动时会发生什么......一个新实例与前一个计数器一起创建并继续在后台运行......并且不会在用户交互时重置......我已经counter = null在 onDestroy 中完成......是对的还是我需要做其他事情???

  public class CountTime extends Activity {

    TextView tv;
    static MyCount counter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tv = new TextView(this);
        this.setContentView(tv);
        // 5000 is the starting number (in milliseconds)
        // 1000 is the number to count down each time (in milliseconds)
        counter = new MyCount(5000, 1000);
        counter.start();
    }

    @Override
    public void onUserInteraction() {
        // TODO Auto-generated method stub
        super.onUserInteraction();
        counter.start();
    }

    // countdowntimer is an abstract class, so extend it and fill in methods
    public class MyCount extends CountDownTimer {
        public MyCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        @Override
        public void onFinish() {
            tv.setText("done!");
        }

        @Override
        public void onTick(long millisUntilFinished) {
            tv.setText("Left: " + millisUntilFinished / 1000);
        }
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        counter = null;
    }
}
4

2 回答 2

2

这是正常的 Android 行为。

在任何时候,一个 Activity 不是前台 Activity,它可能会被销毁,这取决于一些非确定性标准,例如可用内存、正在运行的后台应用程序数量等。

在您的情况下,活动 A 正在被销毁,当您返回它时,会创建一个新实例并调用它的 onCreate() 。

通常,您永远不应该尝试从另一个活动访问活动中的某些内容。

您可以扩展您的应用程序类并在其中实例化您的计时器。

public class MyApplication extends Application{

    static MyCount counter;

    @Override public void onCreate () 
    {     
        super.onCreate();   
        counter = new MyCount();
    } 

}

在您的清单中

<application android:name="com.myname.MyApplication" 

您应该只在真正需要时才使用这种技术。请不要将所有内容都放在扩展的应用程序类中以使事情变得简单。这真是不好的做法。

最后,Android 没有约定 onDestroy() 将在您的活动被销毁时调用。只有您自己完成()活动才能保证。您应该使用 onPause() 来执行当您的活动进入后台(并且可能被破坏)时需要发生的事情。

于 2012-12-05T07:36:07.333 回答
-1

您可以通过替换此行来尝试

 counter = null;

到线

 counter.cancel();
于 2012-12-05T07:29:27.217 回答