活动仍然在finish()之后继续;

时间:2012-09-14 06:52:11

标签: android android-activity kill-process

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

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

然而,当我点击“是”时,它将返回主菜单,但当你仍然在应用程序的任何地方时,结果仍将显示我之前的游戏活动。也许我还没有完成游戏活动,..这是我的活动中的计时器和背压片段:

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 个答案:

答案 0 :(得分: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 Callback中的Timer,


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

答案 1 :(得分:1)

CountDownTimer的属性是,即使你完成了活动,它仍继续countDown。如果您想停止此操作,请在countTimerVar.cancel()finish()时添加pressBackButton

答案 2 :(得分:0)

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

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

答案 3 :(得分: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中断了线程,但没有达到。因此,至少大多数事情都应该在onPause上停止/中断,至少要对UI执行任何操作,例如设置文本。