如何在Android中结束当前活动

83

我有一个Android应用程序。我正在制作带有进度条的加载屏幕。

在onCreate方法中设置了延迟。当计时器完成时,我想结束当前活动并启动新活动。

当调用finish()方法时,会出现异常。

public class LoadingScreen extends Activity{
    private LoadingScreen loadingScreen;
    Intent i = new Intent(this, HomeScreen.class);
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.loading);

        CountDownTimer timer = new CountDownTimer(10000, 1000) //10 second Timer
        {
            public void onTick(long l) 
            {

            }

            @Override
            public void onFinish() 
            {
                loadingScreen.finishActivity(0);
                startActivity(i);
            };
        }.start();
    }
}

如何更改代码,使得它在进度条完成时结束?

9个回答

134
如果你正在创建一个加载屏幕,只需将参数设置为不保留在活动栈中。在你定义活动的 manifest.xml 文件中,这样做:
<activity android:name=".LoadingScreen" android:noHistory="true" ... />

在你的代码中,不再需要调用.finish()。只需执行startActivity(i);

也不需要将当前活动的实例保留在单独的字段中。您可以随时像 LoadingScreen.this.doSomething() 这样访问它,而不是使用 private LoadingScreen loadingScreen;


使用这个参数,它既可以通过startActivity结束活动,也可以通过startActivityForResult结束活动。今天它咬了我一口;D - Zhen
noHistory is not the same as finish() - blueware

54

我尝试使用这个示例,但它失败了。每次我在处理程序中使用finish() / finishactivity(),我就会遇到可怕的java.lang.IllegalAccessException异常。我不确定对于提出问题的人它是如何工作的。

相反,我找到的解决方案是,在您的活动中创建一个方法,例如

void kill_activity()
{ 
    finish();
}

在处理程序的run方法中调用此方法。对我来说,这非常有效。希望这能帮助任何遇到“如何从不同的线程关闭活动?”问题的人。


14

你需要从UI线程中调用finish(),而不是从后台线程中调用。做法是声明一个Handler并请求Handler在UI线程上运行一个Runnable。例如:

public class LoadingScreen extends Activity{
    private LoadingScreen loadingScreen;
    Intent i = new Intent(this, HomeScreen.class);
    Handler handler;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        handler = new Handler();
        setContentView(R.layout.loading);

        CountDownTimer timer = new CountDownTimer(10000, 1000) //10seceonds Timer
        {
             @Override
             public void onTick(long l) 
             {

             }

             @Override
             public void onFinish() 
             {
                 handler.post(new Runnable() {
                     public void run() {
                         loadingScreen.finishActivity(0);
                         startActivity(i);
                     }
                 });
             };
        }.start();
    }
}

1
@AndreiBuneyeu - 这里有一个通用规则(在此处说明):“不要从UI线程外访问Android UI工具包”。虽然文档中没有定义“Android UI工具包”这个术语(至少我没有找到),但认为活动生命周期方法是其一部分似乎是合理的。(显然,某些Activity方法--例如Activity.runOnUiThread(Runnable)--不受此限制。我同意您对文档在这个主题上不够清晰的看法。) - Ted Hopp

14

当您想要启动新的活动并完成当前活动时,可以采取以下操作:

API 11或更高版本

Intent intent = new Intent(OldActivity.this, NewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

API 10或更低版本

Intent intent = new Intent(OldActivity.this, NewActivity.class);
intent.setFlags(IntentCompat.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

我希望这能帮助到某些人 =)


7

只需调用finish()方法:

context.finish();

5
什么是完成方法?我在活动中没有看到任何 this.finish() 方法。 (意思是询问“完成方法”是否存在,提到在活动中没有看到“this.finish()”方法) - nurettin

6
我正在进行的是启动一个新的活动,然后关闭当前的活动。因此,请记住这个简单的规则:
finish()
startActivity<...>()

并且不是

startActivity<...>()
finish()

3

我发现很多答案都不够简单易懂... 希望这篇文章能对你有所帮助...

try{
    Intent intent = new Intent(CurrentActivity.this, NewActivity.class);
    startActivity(intent);
} finally {
    finish();
}

所以,这里有一个非常简单的逻辑,我们知道在Java中,我们编写的代码可能会出现异常,因此我们将该代码放置在try块中,并在catch块中处理该异常,但是在finally块中,我们编写的代码必须被执行(无论是否发生异常)。

2
您还可以使用:finishAffinity()

结束当前任务中与此活动具有相同亲和性的所有下方活动以及此活动。


0

使用

.finish();

来结束Activity

首先要给出上下文,例如:

getApplicationContext.finish();

或者

context.finish();

你可以在任何地方调用它,比如在

按钮的OnClickListener中

或者在

OnBackPressed()方法中

如果你想结束应用程序,那么使用

finishAffinity();

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