Как закончить текущую активность в Android

У меня есть приложение для 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();
    }
}

Как я могу изменить код, чтобы он заканчивался, когда индикатор выполнения сделан?

9 ответов

Решение

Если вы делаете загрузочный экран, просто установите параметр, чтобы он не сохранялся в стеке активности. В файле manifest.xml, где вы определяете свою деятельность, выполните:

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

И в вашем коде больше нет необходимости вызывать.finish(). Просто сделайте startActivity(я);

Также нет необходимости хранить экземпляр вашей текущей активности в отдельном поле. Вы всегда можете получить к нему доступ, как LoadingScreen.this.doSomething() вместо private LoadingScreen loadingScreen;

Я пытался использовать этот пример, но он с треском провалился. Каждый раз, когда я использую для вызова finish()/ finishactivity() внутри обработчика, я сталкиваюсь с этим угрожающим java.lang.IllegalAccess Exception, Я не уверен, как это сработало для того, кто задал вопрос.

Вместо этого я нашел решение создать метод в вашей деятельности, такой как

void kill_activity()
{ 
    finish();
}

Вызовите этот метод из метода run обработчика. Это сработало как обаяние для меня. Надеюсь, что это помогает любому, кто борется с вопросом "как закрыть действие из другого потока?".

Если вы хотите начать новое действие и завершить текущее действие, вы можете сделать это:

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

Я надеюсь, что это может помочь кому-то =)

Вам нужно позвонить finish() из потока пользовательского интерфейса, а не фоновый поток. Способ сделать это - объявить обработчик и попросить обработчик запустить 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();
    }
}

Просто позвони finish() метод:

context.finish();

Я начинал новую деятельность, а затем закрывал текущую. Итак, запомните это простое правило:

finish()
startActivity<...>()

и нет

startActivity<...>()
finish()

Я нашел много ответов, но не один прост... Я надеюсь, что это поможет вам...

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

Итак, здесь очень простая логика, так как мы знаем, что в Java мы пишем код, который имеет некоторые шансы на исключение в блоке try, и обрабатываем это исключение в блоке catch, но в блоке finally мы пишем код, который должен выполняться любой ценой (Либо исключение приходит или нет).

Вы также можете использовать: finishAffinity ()

Завершите это действие, а также все действия непосредственно под ним в текущем задании, которые имеют ту же привязку.

Использовать

.финиш();

для отделки Деятельность

Сначала лайкните контекст:

      getApplicationContext.finish();

Или же

      context.finish();

Вы можете позвонить в любое место, где хотите.

OnClickListener кнопки

кнопки или в

OnBackPressed(); Метод

И если вы хотите закончить приложение, используйте

      finishAffinity();
Другие вопросы по тегам