【问题标题】:Calling finish() on an Android activity doesn't actually finish在 Android Activity 上调用 finish() 并没有真正完成
【发布时间】:2011-02-07 17:01:36
【问题描述】:

我正在打电话给finish(),但我的活动仍在继续。

我有一个由主活动屏幕上的菜单调用的活动。在我的活动的onCreate() 方法中,我有以下代码片段:

    // Make sure there are some events in the list.
    if (theEventArrayList.isEmpty()){
        Toast.makeText(this, "Event List is empty", Toast.LENGTH_LONG).show();
        finish();
    }
    SummarizeCurrentEvent();
    graphEvents();

如果列表为空,它会放置 Toast,我可以在调用 finish() 时设置断点。如果我从调试器中跳出,它会直接转到SummarizeCurrentEvent()。我以为finish() 会退出活动。不是这样吗?在哪里可以找到有关此方法的更多信息?

【问题讨论】:

    标签: android


    【解决方案1】:

    你应该在finish之后加上一个return语句,否则调用finish的方法将被完全执行。

    另外,请参阅这个问题:about finish() in android

    【讨论】:

    • SummarizeCurrentEvent(); graphEvents();... 放在else {} 块中不是更好吗?
    • @ban-geoengineering 你可能有多个if (...) { finish(); return; }。我认为当有代码跟随时,明确地finish() return 是一个好习惯。
    【解决方案2】:

    finish() 只是告诉活动完成它需要做的事情,例如。关闭、调用 onPause、向父级报告结果等。它不执行 exit() 调用或任何操作。

    您应该在完成()调用之后返回。

    【讨论】:

      【解决方案3】:

      除了其他答案之外,您仍然可能调用了 (Re)onStartonResumeonPause

      我这样说是因为在下面的链接中,有一个表说,要杀死一个活动,首先在 Stop 和 onDestroy 上调用 onPause(可能但不能保证)。

      参考Activity

      【讨论】:

        【解决方案4】:

        放入清单:

            <activity android:name=".MainActivity"
                android:noHistory="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
        
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        

        避免将其保存在系统的历史堆栈中

        【讨论】:

          【解决方案5】:

          Finish 完成 Activity,但由主循环执行任何 UI 交互。您必须等到 UI 循环运行,也就是您从 onCreate 返回之后。

          【讨论】:

            【解决方案6】:

            在这种情况下应该使用try...catch 语句。

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                try {
                    //...some initialization...
            
                    // Make sure there are some events in the list.
                    if (theEventArrayList.isEmpty()){
                        throw new Exception("Event List is empty");
                    }
                    SummarizeCurrentEvent();
                    graphEvents();
                } catch (Exception e) {
                    Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
                    finish();
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-12-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多