Как завершить текущую деятельность в 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();
}
}
Как я могу изменить код, чтобы он заканчивался, когда индикатор выполнения будет выполнен?
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(); } }
когда вы хотите начать новую деятельность и закончить нынешней деятельностью вы можете сделать это:
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