J'ai 3 activités. L'activité A qui mène à l'activité B, qui à son tour peut revenir à l'activité A ou démarrer l'activité C. Toutefois, si j'appuie sur l'activité C, l'application devrait se fermer.
Pour résumer:
Comment devrais-je passer de l'activité B à C? Ce code me donne actuellement une exception NullPointerException sur la dernière ligne:
Intent intent=new Intent(ActivityB.this, ActivityC.class);
startActivity(intent);
ActivityB.this.finish();
ActivityB.this.getParent().finish();
Si je permute les deux dernières lignes, j'obtiens aussi un pointeur nul.
Je ne sais pas si cela fonctionnera, mais vous pouvez l'essayer:
A partir de l'activité A, démarrez l'activité B pour un résultat utilisant startActivityForResult()
Dans l'activité B, lorsque l'utilisateur déclenche l'activité C, démarrez l'activité C.
startActivity()
retourne immédiatement, donc
définir un résultat qui informera A de finir également,
Appelez finish()
en B.
Lorsque A reçoit ce résultat de B, A appelle également finish()
sur lui-même.
À défaut, vous pouvez créer l'activité C dans sa propre application, puis fermer la première application (avec A & B) après le démarrage de la seconde.
P.S. Prenez en compte le commentaire de Falmarri à mesure que vous avancez!
Bonne chance.
Si vous souhaitez terminer une activité parent à partir d'une activité enfant,
Dans l'activité parent, lors du déclenchement de l'activité enfant, utilisez la commande suivante: -
startActivityForResult(intent_name,any_integer_variable);
et substituez la méthode onActivityResult de la manière suivante: -
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode==2){
finish();
}
}
Maintenant, dans l'activité enfant, remplacez onStop et onDestroy de la manière suivante: -
protected void onStop() {
setResult(2);
super.onStop();
}
@Override
protected void onDestroy() {
setResult(2);
super.onDestroy();
}
Notez que j'ai défini la valeur 2 dans l'activité enfant et que je la recherche dans l'activité parent. Si la valeur est identique à celle que j'ai définie, l'activité parente se terminera également ..____. Vous pouvez ensuite utiliser des approches récursives pour les activités suivantes.
Vous devez utiliser onActivityResult dans votre activité parent
Supposons que l’activité A soit parent de l’activité B . Si vous souhaitez cliquer sur le bouton Précédent dans l’activité B pour quitter l’application (également pour quitter l’activité A)
Dans votre activité B, dans onStop()
ou onDestroy()
tu appelles
setResult(0); //any int number is fine
cela passera un code de résultat à son activité parente.
Votre parent Actvity A écoute le code de résultat. Vous devrez utiliser la méthode onActivityResult
À l’intérieur de la méthode que vous pouvez appeler
if(resultCode == 0) //matches the result code passed from B
{
ActivityA.this.finish()
}
Ça marche pour moi :)
Rien de tout cela n'a fonctionné pour moi. J'ai donc trouvé une solution. L'aide indique clairement que Intent.FLAG_ACTIVITY_CLEAR_TASK doit être utilisé avec Intent.FLAG_ACTIVITY_NEW_TASK. Donc, voici un code qui a fonctionné pour moi.
Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Je n'ai rien fait de tout ça. Voici comment je réviserais votre code.
le code que vous utilisez pour entrer une autre intention:
Intent whatEverIntentName = new Intent("Path.to.next.Intent");
startActivity(whatEverIntentName);
finish();
De cette façon, vous quittez toujours lorsque vous appuyez en arrière. Mais attendez! Vous pouvez modifier la manière dont vous souhaitez que votre touche Back réagisse lorsque vous appuyez dessus.
Faire ceci:
@Override
public void onBackPressed() {
super.onBackPressed();
Intent whatEverIntentName = new Intent("Path.to.the.activity.before.it");
startActivity(whatEverIntentName);
// Don't add finish here.
//This is necessary because you finished your last activity with finish();
}
Pour démarrer l'activité 'B' à partir de l'activité 'A', utilisez la méthode startActivityForResult comme suit:
Intent intent2 = new Intent(A.this,B.class);
startActivityForResult(intent2,2);
Au lieu de 2, vous pouvez utiliser n’importe quel chiffre.
Implémentez la méthode suivante pour attraper le résultat de l'activité enfant:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 2) {
finish();
}
}
N'oubliez pas d'utiliser le même chiffre que vous avez utilisé lors du démarrage de l'activité.
Maintenant, dans l'activité 'B', procédez comme suit: Pour démarrer l'activité 'C'
Intent intent3 = new Intent(B.this,C.class);
startActivityForResult(intent3,3);
Mettre en œuvre la méthode
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == 3) {
setResult(2);
finish();
}
}
Ici, vous terminez l'activité 'A' en définissant le résultat sur 2 . L'activité de finition 'B' termine donc l'activité 'A'.
Et mettez la ligne suivante dans l’activité 'C':
setResult(3);
Dès que votre activité "C" commence, vos activités précédentes sont terminées.
Donc, le soutien de l'activité 'C' ferme l'application.
essaye ça
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
si vous êtes sur l'activité A et que vous avez démarré une autre activité appelée activité B . activité A -> activité B
Et maintenant, vous voulez fermer les deux activités.
utilisez ensuite le code ci-dessous dans l'activité B.
B.this.finish();
Et utilisez ce code dans l'activité A:
startActivity(new Intent(A.this, B.class));
finish();
Dès que l'activité B sera terminée, l'activité A sera également terminée.
Il y a un inconvénient, je ne sais pas si vous le souhaitez ou non.
L'inconvénient est que si l'utilisateur est sur l'activité B et qu'il appuie sur le bouton Précédent pour passer à l'activité A. Ensuite, l'activité A se termine également dans ce cas.
Cela fonctionne parfaitement:
btn_back.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v) {
Player.this.finish();
}
});
Vous pouvez utiliser finishAffinity()
, cela fermera les activités courante et parent de l’activité courante.
Remarque: Mais les résultats de l'activité enfant vers l'activité parent ne seront pas traités.
J'espère que ça aide !!
A partir de l'activité A, démarrez l'activité B pour un résultat utilisant startActivityForResult (intention, 19)
Dans l'activité B, lorsque l'utilisateur déclenche l'activité C, démarrez l'activité C.
startActivity () retourne immédiatement, donc
définir un résultat qui informera A de finir également,
Appelez la méthode finish () dans B . Et appelez setResult () avant la méthode finish () dans votre activité enfantEn activité parent B, A appelle également finish () sur lui-même.
enter code here
@Override
protected void onActivityResult(int arg0, int arg1, Intent arg2) {
//Added by Ashish to close parent activity
if(arg1==19){
finish();
}
super.onActivityResult(arg0, arg1, arg2);
}
À partir de l’écran (B), vous souhaitez démarrer l’écran (C) sans écran arrière, il suffit de lancer l’écran (C) avec:
screenC.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(screenC);
finish();
Le retour dans screenC va quitter l'application.
Intent intent=new Intent(ActivityB.this, ActivityC.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
votre activité C sera l'activité racine et à la fin, les applications seront finies.
Vous pouvez simplement remplacer le comportement de la touche back :
L'activité A commence l'activité B
En appuyant sur l'activité B devrait conduire à A
L'activité B commence l'activité C
En appuyant sur Retour sur l'activité C devrait fermer l'application
Notez que je n'appelle pas super depuis onBackPressed . Cela vous permet également de remplacer le mécanisme de la pile de navigation pour Android, ce qui me semble être un gros avantage, car il ne semble pas actuellement y avoir de moyen d'effacer seul élément le plus ancien de la pile de navigation d'une manière simple.
public class B extends Activity
{
...
@Override
public void onBackPressed()
{
// Start activity A
Intent aIntent = new Intent(this, A);
startActivity(bIntent);
}
...
}
public class C extends Activity
{
...
@Override
public void onBackPressed()
{
// Close
finish();
}
...
}
Vous pouvez également terminer l'activité parente si nécessaire, mais en utilisant cette méthode, vous n'avez pas à vous en préoccuper.
Le code suivant devrait le faire pour vous. Presque dans toutes les autres approches, votre application restera dans les applications récentes. Javadoc peut être trouvé à l'adresse, https://developer.Android.com/reference/Android/app/ActivityManager.AppTask.html#finishAndRemoveTask ()
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
if(am != null) {
List<ActivityManager.AppTask> tasks = am.getAppTasks();
if (tasks != null) {
tasks.get(0).finishAndRemoveTask();
}
}
Demandez à chaque activité d'écouter le résultat de l'activité suivante et de se terminer si cela se produit.
Vous pouvez utiliser un code de résultat spécial pour indiquer que vous souhaitez que l'activité se termine.