如何在Android中完成当前活动


77

我有一个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();
    }
}

如何更改代码,使其在进度条完成后结束?

Answers:


126

如果正在执行加载屏幕,只需将参数设置为不将其保留在活动堆栈中即可。在清单文件中定义活动的位置:

<activity android:name=".LoadingScreen" android:noHistory="true" ... />

并且在您的代码中,不再需要调用.finish()了。只要做startActivity(i);

也无需将当前活动的实例保存在单独的字段中。您可以随时访问喜欢LoadingScreen.this.doSomething()的,而不是private LoadingScreen loadingScreen;


如果使用此参数,它将以startActivity以及startActivityForResult结束活动。它今天咬了我; D

noHistoryfinish()
blueware

49

我尝试使用此示例,但失败了。每次我在处理程序内部调用finish()/ finishactivity()时,都会遇到这种威胁java.lang.IllegalAccess Exception。我不确定提出这个问题的人是如何工作的。

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

void kill_activity()
{ 
    finish();
}

从处理程序的run方法内部调用此方法。这对我来说就像一种魅力。希望这可以帮助任何挣扎于“如何从另一个线程关闭活动?”的人。


13

您需要finish()从UI线程而不是后台线程进行调用。完成此操作的方法是声明一个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

10

当您要开始一个新活动并完成当前活动时,可以执行以下操作:

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

我希望这可以帮助某人=)




2

我找到了很多答案,但不是一个简单的答案...希望对您有所帮助...

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

因此,这里有非常简单的逻辑,因为我们知道在Java中,我们编写的代码在try块中有发生异常的机会,并在catch块中处理该异常,但是在最后的块中,我们编写了必须以任何代价执行的代码(不管有没有例外)。


2

我正在做的是开始一个新活动,然后关闭当前活动。因此,请记住以下简单规则:

finish()
startActivity<...>()

并不是

startActivity<...>()
finish()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.