如何在Android中完成当前活动

时间:2011-02-15 07:11:55

标签: android activity-finish

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

如何更改代码以便在进度条完成时结束?

8 个答案:

答案 0 :(得分:118)

如果您正在进行加载屏幕,只需将参数设置为不将其保留在活动堆栈中。在manifest.xml中,您可以在其中定义您的活动:

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

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

也无需在单独的字段中保留当前活动的实例。您始终可以像LoadingScreen.this.doSomething()而不是private LoadingScreen loadingScreen;

那样访问它

答案 1 :(得分:43)

我尝试使用这个例子,但它失败了。每次我在处理程序中调用finish()/ finishactivity()时,我都会遇到这种威胁java.lang.IllegalAccess Exception。我不确定这对提出这个问题的人有什么用处。

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

void kill_activity()
{ 
    finish();
}

从处理程序的run方法内部调用此方法。这对我来说就像一个魅力。希望这有助于任何人在努力解决“如何从不同的线程关闭活动?”。

答案 2 :(得分:12)

您需要从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();
    }
}

答案 3 :(得分:8)

只需调用finish()方法:

context.finish();

答案 4 :(得分:7)

如果要开始新活动并完成当前活动,可以执行以下操作:

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

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

答案 5 :(得分:2)

您还可以使用:finishAffinity()

  

完成此活动以及当前任务中具有相同亲和力的紧随其下的所有活动。

答案 6 :(得分:2)

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

finish()
startActivity<...>()

不是

startActivity<...>()
finish()

答案 7 :(得分:1)

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

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

所以, 逻辑很简单,因为我们知道在Java中,我们编写的代码在try块中有发生异常的可能性,并在catch块中处理该异常,但是在最后的块中,我们编写了必须以任何代价执行的代码(异常发生与否)。