79

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

我在 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();
    }
}

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

4

8 回答 8

134

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

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

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

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

于 2011-02-15T07:19:34.843 回答
52

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

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

void kill_activity()
{ 
    finish();
}

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

于 2011-10-05T19:23:54.327 回答
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();
    }
}
于 2011-02-15T07:20:16.013 回答
13

当您想开始一项新活动并完成当前活动时,您可以这样做:

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

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

于 2016-05-16T07:00:28.793 回答
7

只需调用finish()方法:

context.finish();
于 2015-03-04T03:27:09.137 回答
6

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

finish()
startActivity<...>()

并不是

startActivity<...>()
finish()
于 2020-02-18T10:27:08.983 回答
3

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

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

所以,这里有非常简单的逻辑,因为我们知道在 java 中我们编写的代码在 try 块中有一些发生异常的机会,并在 catch 块中处理该异常,但在 finally 块中我们编写的代码必须以任何成本执行(异常是否出现)。

于 2018-12-31T11:59:09.850 回答
2

您还可以使用:finishAffinity()

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

于 2018-06-13T17:00:27.963 回答