Как завершить текущую работу в 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);
Надеюсь, это может помочь кому-то =)