Як закінчити поточну активність в Android


78

У мене є програма для 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();
    }
}

Як я можу змінити код так, щоб він закінчувався, коли завершується індикатор виконання?

Відповіді:


127

Якщо ви виконуєте екран завантаження, просто встановіть параметр, щоб не тримати його в стеку активності. У вашому manifest.xml, де ви визначаєте свою активність, виконайте:

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

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

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


За допомогою цього параметра він завершує діяльність за допомогою startActivity, а також startActivityForResult. Це мене сьогодні вкусило; D
Чжень

noHistoryце не те саме, щоfinish()
blueware

49

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

Натомість рішенням, яке я знайшов, було створення у вашій діяльності такого методу, як

void kill_activity()
{ 
    finish();
}

Викликати цей метод зсередини методу запуску обробника. Це спрацювало для мене як шарм. Сподіваюся, це допомагає кожному, хто бореться з питанням "як закрити діяльність із іншої нитки?".


13

Вам потрібно дзвонити 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();
    }
}

1
@AndreiBuneyeu - Існує загальне правило (зазначене тут ): "Не отримувати доступ до набору інструментів інтерфейсу Android за межами потоку інтерфейсу користувача". Хоча термін "набір інструментів для інтерфейсу користувача Android" ніде не визначений у документації (який я міг знайти), здається розумним вважати методи життєвого циклу діяльності частиною цього. (Очевидно, що деякі Activityметоди - наприклад - Activity.runOnUiThread(Runnable)не підпадають під це обмеження. Я згоден з вами, що документи не настільки чіткі, як їм потрібно бути з цього питання.)
Тед Хопп,

11

Коли ви хочете розпочати нову діяльність і закінчити поточну, ви можете зробити це:

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

Я сподіваюся, це може комусь допомогти =)


8

Просто зателефонуйте finish()методу:

context.finish();

3
який метод обробки? Я не бачу жодного методу this.finish () в діяльності
нуреттин

2

Ви також можете використовувати: finishAffinity ()

Завершіть цю діяльність, а також усі дії безпосередньо під нею у поточному завданні, що мають однакову спорідненість.


2

Я знайшов багато відповідей, але не одна з них проста ... Сподіваюся, це допоможе вам ...

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

Отже, тут є дуже проста логіка, оскільки ми знаємо, що в Java ми пишемо код, який має певні шанси на виняток, у блоці try та обробляємо цей виняток у блоці catch, але в блоці нарешті ми пишемо код, який повинен бути виконаний за будь-яку ціну ( Або виняток настає, чи ні).


2

Те, що я робив, - це почати нову діяльність, а потім закрити поточну. Отже, запам’ятайте це просте правило:

finish()
startActivity<...>()

і ні

startActivity<...>()
finish()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.