0

アプリケーションに多くのアクティビティがあります (例: A->B->C->D)...セッション タイムアウトに使用しているカウントダウンタイマーがあります..私が行ったことは、静的カウンターを作成することです...私はアクティビティ A でカウンターを開始します....ユーザーが操作するとカウンターがリセットされます...これはアクティビティ B、C、D にも適用されます....アクティビティ D の終了時にも、アクティビティ A が開始されます..この i について使用addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)したので、スタックをクリアします...

しかし、アクティビティAが再び開始されたときに何が起こるか..新しいインスタンスが前のカウンターとともに作成され、バックグラウンドで実行され続けます....そしてユーザーインタラクションでリセットされません...私はcounter = nullonDestroyでやった....それは正しいですか、それとも何か他のことをする必要がありますか???

  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 の動作です。

アクティビティがフォアグラウンド アクティビティでない場合はいつでも、空きメモリ、実行中のバックグラウンド アプリの数などの非決定論的な基準に応じて破棄される可能性があります。

あなたの場合、アクティビティ 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" 

この手法は、本当に必要な場合にのみ使用してください。簡単にするために、拡張アプリケーション クラスにすべてを入れないでください。それは本当に悪い習慣です。

最後に、アクティビティが破棄された場合に onDestroy() が呼び出されるという Android との契約はありません。自分でアクティビティを終了した場合にのみ保証されます。アクティビティがバックグラウンドに移行する (そして破棄される可能性がある) ときに必要な処理を行うには、onPause() を使用する必要があります。

于 2012-12-05T07:36:07.333 に答える
-1

この行を置き換えることでこれを試すことができます

 counter = null;

行に

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