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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

void kill_activity()
{ 
    finish();
}

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

Ответ 3

Вам нужно вызвать 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();
    }
}

Ответ 4

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

context.finish();

Ответ 5

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

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

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