J'ai une application Android. Je crée un écran de chargement avec une barre de progression.
J'ai entré un délai dans la méthode onCreate. Lorsque le chronomètre se termine, je souhaite terminer l'activité en cours et en commencer une nouvelle.
Cela me donne juste une exception quand il appelle la méthode 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();
}
}
Comment puis-je modifier le code afin qu'il se termine lorsque la barre de progression est terminée?
Si vous effectuez un écran de chargement, définissez simplement le paramètre pour ne pas le conserver dans la pile d'activité. Dans votre fichier manifest.xml, où vous définissez votre activité, faites:
<activity Android:name=".LoadingScreen" Android:noHistory="true" ... />
Et dans votre code, il n'est plus nécessaire d'appeler .finish (). Il suffit de commencer startActivity (i);
Il n'est également pas nécessaire de conserver une instance de votre activité actuelle dans un champ séparé. Vous pouvez toujours y accéder comme LoadingScreen.this.doSomething()
au lieu de private LoadingScreen loadingScreen;
J'ai essayé d'utiliser cet exemple, mais il a lamentablement échoué. Chaque fois que j'invoque finish ()/finishactivity () dans un gestionnaire, je me retrouve avec ce Java.lang.IllegalAccess Exception
menaçant. Je ne sais pas comment cela a fonctionné pour celui qui a posé la question.
Au lieu de cela, la solution que j’ai trouvée était de créer une méthode dans votre activité telle que
void kill_activity()
{
finish();
}
Appelez cette méthode depuis la méthode d'exécution du gestionnaire. Cela a fonctionné comme un charme pour moi. J'espère que cela aidera tous ceux qui ont du mal à "comment fermer une activité à partir d'un fil différent?".
Vous devez appeler finish()
à partir du thread d'interface utilisateur, et non d'un thread d'arrière-plan. Pour ce faire, vous devez déclarer un gestionnaire et lui demander d'exécuter un exécutable sur le thread d'interface utilisateur. Par exemple:
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();
}
}
Appelez simplement la méthode finish()
:
context.finish();
Lorsque vous souhaitez commencer une nouvelle activité et terminer l'activité en cours, vous pouvez le faire:
API 11 ou supérieure
Intent intent = new Intent(OldActivity.this, NewActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
API 10 ou inférieure
Intent intent = new Intent(OldActivity.this, NewActivity.class);
intent.setFlags(IntentCompat.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
J'espère que cela peut aider quelqu'un =)
Vous pouvez également utiliser: finishAffinity ()
Terminez cette activité ainsi que toutes les activités immédiatement inférieures à celle-ci dans la tâche en cours ayant la même affinité.
J'ai trouvé beaucoup de réponses mais aucune n'est simple .... J'espère que cela vous aidera ...
try{
Intent intent = new Intent(CurrentActivity.this, NewActivity.class);
startActivity(intent);
} finally {
finish();
}
so, La logique est très simple, car nous savons qu'en Java, nous écrivons du code qui a quelques chances d'exception dans un bloc try et que nous gérons cette exception dans un bloc catch, mais dans un bloc, nous écrivons un code qui doit être exécuté. tout coût (ou l'exception vient ou pas).