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


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

459   6  

6 ответов:

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

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

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

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

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

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

void kill_activity()
{ 
    finish();
}

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

нужно позвонить 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();

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

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

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

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

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

Comments

    Ничего не найдено.