如何在Android中完成当前活动

Sha*_*hah 72 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lov 121

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

<activity android:name=".LoadingScreen" android:noHistory="true" ... />
Run Code Online (Sandbox Code Playgroud)

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

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


Sri*_*ram 46

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

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

void kill_activity()
{ 
    finish();
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个问题,而不是答案. (5认同)

Ted*_*opp 12

您需要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();
    }
}
Run Code Online (Sandbox Code Playgroud)


Joo*_*lah 9

只需调用finish()方法:

context.finish();
Run Code Online (Sandbox Code Playgroud)

  • 什么完成方法?我在活动中没有看到任何 this.finish() 方法 (3认同)

Dan*_* S. 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);
Run Code Online (Sandbox Code Playgroud)

API 10或更低

Intent intent = new Intent(OldActivity.this, NewActivity.class);
intent.setFlags(IntentCompat.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

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


blu*_*are 6

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

finish()
startActivity<...>()
Run Code Online (Sandbox Code Playgroud)

并不是

startActivity<...>()
finish()
Run Code Online (Sandbox Code Playgroud)