Как закончить текущую активность в 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();
}
}
Как я могу изменить код, чтобы он заканчивался, когда индикатор выполнения сделан?
9 ответов
Если вы делаете загрузочный экран, просто установите параметр, чтобы он не сохранялся в стеке активности. В файле manifest.xml, где вы определяете свою деятельность, выполните:
<activity android:name=".LoadingScreen" android:noHistory="true" ... />
И в вашем коде больше нет необходимости вызывать.finish(). Просто сделайте startActivity(я);
Также нет необходимости хранить экземпляр вашей текущей активности в отдельном поле. Вы всегда можете получить к нему доступ, как LoadingScreen.this.doSomething()
вместо private LoadingScreen loadingScreen;
Я пытался использовать этот пример, но он с треском провалился. Каждый раз, когда я использую для вызова finish()/ finishactivity() внутри обработчика, я сталкиваюсь с этим угрожающим java.lang.IllegalAccess Exception
, Я не уверен, как это сработало для того, кто задал вопрос.
Вместо этого я нашел решение создать метод в вашей деятельности, такой как
void kill_activity()
{
finish();
}
Вызовите этот метод из метода run обработчика. Это сработало как обаяние для меня. Надеюсь, что это помогает любому, кто борется с вопросом "как закрыть действие из другого потока?".
Если вы хотите начать новое действие и завершить текущее действие, вы можете сделать это:
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);
Я надеюсь, что это может помочь кому-то =)
Вам нужно позвонить 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()
startActivity<...>()
и нет
startActivity<...>()
finish()
Я нашел много ответов, но не один прост... Я надеюсь, что это поможет вам...
try{
Intent intent = new Intent(CurrentActivity.this, NewActivity.class);
startActivity(intent);
} finally {
finish();
}
Итак, здесь очень простая логика, так как мы знаем, что в Java мы пишем код, который имеет некоторые шансы на исключение в блоке try, и обрабатываем это исключение в блоке catch, но в блоке finally мы пишем код, который должен выполняться любой ценой (Либо исключение приходит или нет).
Вы также можете использовать: finishAffinity ()
Завершите это действие, а также все действия непосредственно под ним в текущем задании, которые имеют ту же привязку.
Использовать
.финиш();
для отделки Деятельность
Сначала лайкните контекст:
getApplicationContext.finish();
Или же
context.finish();
Вы можете позвонить в любое место, где хотите.
OnClickListener кнопки
кнопки или в
OnBackPressed(); Метод
И если вы хотите закончить приложение, используйте
finishAffinity();