J'ai une application où, sur la page d'accueil, j'ai des boutons pour naviguer dans l'application.
Sur cette page, j'ai un bouton "EXIT" qui, lorsqu'il est cliqué, devrait amener l'utilisateur à l'écran d'accueil du téléphone où se trouve l'icône de l'application.
Comment puis je faire ça?
La conception d'Android ne favorise pas la sortie d'une application par choix, mais la gère plutôt par le système d'exploitation. Vous pouvez faire apparaître l'application Home par son intention correspondante:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Peut-être que vous pouvez essayer quelque chose comme ça
Supposons que dans notre application, nous avons un certain nombre d'activités (disons dix) et que nous devons sortir directement de cette activité. Ce que nous pouvons faire, c’est créer une intention et aller à l’activité racine et définir l’indicateur dans l’intention comme suit:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
aussi, ajoutez un peu comme booléen à l'intention
intent.putExtra("EXIT", true);
Ensuite, dans l’activité racine, vérifiez la valeur de boolean
et, en fonction de cet appel, finish (), dans la onCreate()
de l’activité racine
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
}
System.exit(0);
Est probablement ce que vous recherchez. Cela fermera toute l'application et vous amènera à l'écran d'accueil.
Cela fonctionne bien pour moi.
Fermez toutes les activités précédentes comme suit:
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Exit me", true);
startActivity(intent);
finish();
Puis, dans la méthode onActivity () de MainActivity, ajoutez ceci pour terminer la tâche MainActivity.
setContentView(R.layout.main_layout);
if( getIntent().getBooleanExtra("Exit me", false)){
finish();
return; // add this to prevent from doing unnecessary stuffs
}
d'abord terminer votre application en utilisant la méthode finish();
puis ajoutez les lignes ci-dessous dans onDestroy pour la suppression de force
Android.os.Process.killProcess(Android.os.Process.myPid());
super.onDestroy();
Si vous souhaitez mettre fin à une activité, vous pouvez simplement appeler finish()
. Il est toutefois déconseillé d’afficher un bouton de sortie à l’écran.
Il n'est pas recommandé de quitter votre application Android. Voir cette question pour plus de détails.
L'utilisateur peut toujours quitter votre application via le bouton d'accueil ou dans la première activité via le bouton de retour.
Certaines activités que vous ne voulez pas ouvrir à nouveau lorsque vous cliquez sur le bouton Précédent sont les suivantes: activité écran de démarrage, activité de l'écran d'accueil, fenêtres de confirmation. En fait, vous n’avez pas besoin de cela dans la pile d’activités. vous pouvez le faire en utilisant => ouvrir le fichier manifest.xml et ajouter un attribut
Android: noHistory = "true"
à ces activités.
<activity
Android:name="com.example.shoppingapp.AddNewItems"
Android:label=""
Android:noHistory="true">
</activity>
OR
Parfois, vous souhaitez fermer l’application entière en appuyant sur le bouton Précédent. La meilleure pratique consiste à ouvrir la fenêtre d’accueil au lieu de quitter l’application. Pour cela, vous devez remplacer la méthode onBackPressed (). généralement, cette méthode ouvre la première activité de la pile.
@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);
}
OR
En appuyant sur le bouton Précédent, vous souhaitez quitter cette activité et vous ne souhaitez pas non plus l'ajouter à la pile d'activités. Méthode call () dans la méthode onBackPressed (). il ne fera pas fermer l'application entière. il ira pour l'activité précédente dans la pile.
@Override
public void onBackPressed() {
finish();
}
(J'ai essayé les réponses précédentes mais certaines lacunes manquent. Par exemple, si vous ne faites pas de return;
après avoir terminé l'activité, le code d'activité restant est exécuté. Vous devez également éditer onCreate avec return. Si vous ne l'exécutez pas, super.onCreate () vous obtiendrez une erreur d'exécution)
Disons que vous avez MainActivity
et ChildActivity
.
Dans ChildActivity, ajoutez ceci:
Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;
Dans onCreate de MainActivity, ajoutez ceci:
@Override
public void onCreate(Bundle savedInstanceState) {
mContext = getApplicationContext();
super.onCreate(savedInstanceState);
if (getIntent().getBooleanExtra("EXIT", false)) {
finish();
return;
}
// your current codes
// your current codes
}
Une autre option consiste à utiliser la méthode FinishAffinity pour fermer toutes les tâches de la pile liées à l'application.
Voici ce que j'ai fait:
SomeActivity.Java
@Override
public void onBackPressed() {
Intent newIntent = new Intent(this,QuitAppActivity.class);
newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(newIntent);
finish();
}
QuitAppActivity.Java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
finish();
}
En gros, ce que vous avez fait est de supprimer toutes les activités de la pile et de lancer QuitAppActivity
, ce qui terminera la tâche.
Lorsque vous appelez finir, onDestroy () de cette activité sera appelé et il reviendra à l’activité précédente dans la pile d’activités ... Donc, pour quitter, n’appelez pas finish ();
Je l'ai fait avec le mode observateur.
Interface d'observateur
public interface Observer {
public void update(Subject subject);
}
Sujet de base
public class Subject {
private List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer observer){
observers.add(observer);
}
public void detach(Observer observer){
observers.remove(observer);
}
protected void notifyObservers(){
for(Observer observer : observers){
observer.update(this);
}
}
}
Sujet enfant implémente la méthode de sortie
public class ApplicationSubject extends Subject {
public void exit(){
notifyObservers();
}
}
Mon application que votre application devrait étendre
public class MyApplication extends Application {
private static ApplicationSubject applicationSubject;
public ApplicationSubject getApplicationSubject() {
if(applicationSubject == null) applicationSubject = new ApplicationSubject();
return applicationSubject;
}
}
Activité de base
public abstract class BaseActivity extends Activity implements Observer {
public MyApplication app;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
app = (MyApplication) this.getApplication();
app.getApplicationSubject().attach(this);
}
@Override
public void finish() {
// TODO Auto-generated method stub
app.getApplicationSubject().detach(this);
super.finish();
}
/**
* exit the app
*/
public void close() {
app.getApplicationSubject().exit();
};
@Override
public void update(Subject subject) {
// TODO Auto-generated method stub
this.finish();
}
}
testons-le
public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
close(); //invoke 'close'
}
}
J'ai essayé de quitter l'application en utilisant l'extrait de code suivant, cela a fonctionné pour moi. J'espère que cela vous aide. j'ai fait une petite démo avec 2 activités
première activité
public class MainActivity extends Activity implements OnClickListener{
private Button secondActivityBtn;
private SharedPreferences pref;
private SharedPreferences.Editor editer;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
secondActivityBtn.setOnClickListener(this);
pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
editer = pref.edit();
if(pref.getInt("exitApp", 0) == 1){
editer.putInt("exitApp", 0);
editer.commit();
finish();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.SecondActivityBtn:
Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
startActivity(intent);
break;
default:
break;
}
}
}
votre toute autre activité
public class YourAnyActivity extends Activity implements OnClickListener {
private Button exitAppBtn;
private SharedPreferences pref;
private SharedPreferences.Editor editer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_any);
exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
exitAppBtn.setOnClickListener(this);
pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
editer = pref.edit();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.exitAppBtn:
Intent main_intent = new Intent(YourAnyActivity.this,
MainActivity.class);
main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(main_intent);
editer.putInt("exitApp",1);
editer.commit();
break;
default:
break;
}
}
}
100% fonctionne bien. c'est le code pour Quitter votre application onClick (Method)
Button exit = (Button)findViewById(R.id.exitbutton);
exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
Android.os.Process.killProcess(Android.os.Process.myPid());
System.exit(1);
Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();
}
});
Ajoutez les lignes suivantes après finish();
dans onDestroy()
:
Android.os.Process.killProcess(Android.os.Process.myPid());
super.onDestroy();
si vous voulez quitter l'application mettez ce code sous votre fonction
public void yourFunction()
{
finishAffinity();
moveTaskToBack(true);
}
//For an instance, if you want to exit an application on double click of a
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
// do something on back.
From Android 16+ you can use the following:
finishAffinity();
moveTaskToBack(true);
}
return super.onKeyDown(keyCode, event);
}