it-swarm-ru.tech

Как закончить текущую активность в 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();
    }
}

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

65
Shah

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

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

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

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

115
Alex Orlov

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

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

void kill_activity()
{ 
    finish();
}

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

43
Sriram

Вы должны вызывать 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();
    }
}
11
Ted Hopp

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

context.finish();
7
Joolah

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

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

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

7
Daniel S.

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

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

2
Carlos Rodríguez

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

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

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

0
Hi-Tech Genius