在Android活动中调用finish()方法并不会真正结束活动。

52

我调用了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() 会退出活动。这不是情况吗?在哪里可以找到有关此方法的更多信息?
6个回答

79

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

此外,请参考这个问题:关于 Android 中的 finish()


1
SummarizeCurrentEvent(); graphEvents();... 放在一个 else {} 块里面不是更好吗? - ban-geoengineering
@ban-geoengineering 你可能会有多个 if (...) { finish(); return; }。我认为当后面还有代码时,显式地 finish() return 是一个好习惯。 - Stephan Henningsen

7

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

在finish()调用后,您应该返回。


4

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

我这样说是因为在下面的链接中,有一个表格显示,对于一个活动被杀死,首先会调用onPause(可能但不保证)在onStoponDestroy上。

参考Activity


1
将其放入清单文件中:
    <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>

为了避免将其保存在系统的历史堆栈中,需要进行处理。

0

Finish方法结束了Activity,但是任何UI交互都由主循环来处理。你必须等待UI循环运行,这是在从onCreate返回之后。


-1

这是应该使用 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();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接