我有一个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();
}
}
如何更改代码以便在进度条完成时结束?
答案 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块中处理该异常,但是在最后的块中,我们编写了必须以任何代价执行的代码(异常发生与否)。