5

我有一个测验应用程序,它有一个用于整个游戏活动的计时器,您应该在指定的几分钟内回答尽可能多的问题。

指定的分钟结束后,它将带您进入显示您分数的结果活动。在后按时,我创建了一个警告对话框,询问您是否要返回主菜单。如果单击“是”,页面应返回主菜单并停止/终止游戏活动。

但是,当我单击“是”时,它会返回主菜单,但是当您仍在应用程序中的任何位置时,结果仍会从我之前的游戏活动中显示出来。也许我还没有真正完成游戏活动,.. 这是我活动中的计时器和后按片段:

new CountDownTimer(seconds, 1000) {
    public void onTick(long millisUntilFinished) {
             timer.setText("Seconds left: " + millisUntilFinished / 1000);
    }   
    public void onFinish() {
             Intent intent = new Intent(GameActivityAddition.this, Score.class);
             intent.putExtra("totalscore", score);
             intent.putExtra("numberquestions", rowId);
             intent.putExtra("d", difficulty);
             db.close();
             startActivity(intent);
    }
}.start();

@Override
public void onBackPressed() {
    AlertDialog.Builder abuilder = new Builder(GameActivityAddition.this);
    abuilder.setMessage("Return to Main Menu?");
    abuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            Intent main = new Intent(GameActivityAddition.this, Main.class);
            startActivity(main);
            finish();           
        }
    });
    abuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();            
        }
    });
    AlertDialog alert = abuilder.create();
    alert.show();
}
4

4 回答 4

2

无法保证 finish() 会立即关闭您当前的活动(取决于 Android。)


为了解决你的问题,试试这个,


保持对计时器的引用(当用户离开当前活动时,您将使用它来取消计时器),

CountDownTimer resultTimer = new CountDownTimer(seconds, 1000) {
    public void onTick(long millisUntilFinished) {
             timer.setText("Seconds left: " + millisUntilFinished / 1000);
    }   
    public void onFinish() {
             Intent intent = new Intent(GameActivityAddition.this, Score.class);
             intent.putExtra("totalscore", score);
             intent.putExtra("numberquestions", rowId);
             intent.putExtra("d", difficulty);
             db.close();
             startActivity(intent);
    }
}.start();


并在 onBackPressed() - 取消 setPositiveButton 回调中的计时器,


@Override
public void onBackPressed() {
    AlertDialog.Builder abuilder = new Builder(GameActivityAddition.this);
    abuilder.setMessage("Return to Main Menu?");
    abuilder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            resultTimer.cancel(); //Stop the timer
            resultTimer = null;
            Intent main = new Intent(GameActivityAddition.this, Main.class);
            startActivity(main);
            finish();           
        }
    });
    abuilder.setNegativeButton("No", new DialogInterface.OnClickListener() {

        public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();            
        }
    });
    AlertDialog alert = abuilder.create();
    alert.show();
}
于 2012-09-14T07:11:13.300 回答
1

的属性CountDownTimer是,即使你完成了它继续倒计时的活动。如果您想停止这种情况,请输入countTimerVar.cancel()when you finish()and in pressBackButton

于 2012-09-14T07:15:14.143 回答
0

从子活动结束父活动可以通过使用startActivityForResult启动子活动并实现onActivityResult来处理子活动返回的结果来实现。示例:从 ParentActivity,使用startActivityForResult(). 然后,设置一个结果,通知 ParentActivity 也完成。在 ChildActivity 中调用 finish() 。当 ParentActivity 从 ChildActivity 接收到该结果时, ParentActivity 也会对其自身调用 finish() 。在那里你可以开始另一个活动。

代码请参考:http ://www.androidcompetencycenter.com/2009/03/tutorial-how-to-start-a-new-activity/

于 2012-09-14T07:12:35.430 回答
0

另一种方法可能是在计时器内添加对 MyActivity.this.isFinishing() 的检查:

public void onTick(long millisUntilFinished) {
    try{
         if(!MyActivity.this.isFinishing() )
            timer.setText("Seconds left: " + millisUntilFinished / 1000);
         //else: dont do anything
    }catch(Exception e){e.printStackTrace();}
} 

对于 onFinish().. 也是如此。那么即使它没有被活动停止,计时器也不应该做任何事情。我还认为计时器会将活动保持一段时间,因此它可能只会进入 onPause 而不会进入 onDestroy 直到计时器结束。我有一个线程的情况,我中断线程不是在暂停而是在 onStop 并且它没有达到那个。因此,至少如果它对 UI 执行任何操作(例如设置文本),则大多数事情都应该在 onPause 上停止/中断。

于 2020-01-22T13:39:45.727 回答