【问题标题】:Activity still continues after finish();在完成()之后活动仍然继续;
【发布时间】:2012-09-07 07:43:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 可能是你在结果activity中设置的数据在你结束activity时没有被清除,导致你再次访问activity时看到的是旧数据。
  • 你没有停止倒计时。
  • 我猜,只是猜,倒数计时器就像一个线程,即使你调用finish()它也会继续运行。尝试在计时器中添加一个布尔变量来控制它的运行。

标签: android android-activity kill-process


【解决方案1】:

无法保证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 回调中取消 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();
}

【讨论】:

  • "无法保证finish() 会立即关闭您当前的活动(取决于Android。)" -- 这是错误的;当finish() 被调用时,活动立即结束。 没有结束的是活动所经历的过程。因此,在活动期间设置的任何静态数据都将保持设置。
  • 我的错,我应该提供更多信息。不保证会立即调用 Activity 的 onDestroy(即使 Activity 完全从屏幕上移除),并且保留的内存不仅对应于静态数据。
  • @66CLSjY - 感谢您的详细回答。绝对解决了! :)
  • @TedHopp 你能给出一个关于如何杀死那个进程的更详细的答案吗?
【解决方案2】:

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

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

【讨论】:

  • 我在我的应用程序中完成了完全相同的操作,但问题是当按下子 Activity 上的后退按钮时,该 Activity 被暂停并且父 Activity 及其片段的 onResume() 被完美调用。但是 1. Activity 需要太多时间才能完成,而且看起来电话挂了。 2.如果下次我显示任何对话框,它将不起作用,因为子活动仍然是他们但不可见....现在,如果我旋转屏幕或转到其他片段 onStop 和子活动的 onDestroy 被调用之后一切似乎都正常了。
【解决方案3】:

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

【讨论】:

  • 您是对的,但最好在 onPause.. 方法中执行此操作,因此当用户使用家庭或切换应用程序时,计时器也会停止。至少如果有(像这里)用 ui 完成的任何事情。
【解决方案4】:

另一种方法可能是在计时器内添加对 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 上停止/中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    相关资源
    最近更新 更多