[Tutorial] Chiudere app da activity secondaria
Per chiudere correttamente un Activity si usa “this.finish()”. Ma questo comporta la chiusura dell’activity in cui siamo, se è un Activity principale si uscirà totalmente dall’applicazione, altrimenti torneremo all’Activity precedente. Se per esempio abbiamo un menu come Activity secondaria, e vogliamo che dal menu sia possibile chiudere totalmente l’applicazione, dovremmo aprire il menu con un Activity for result.
Esempio:
Creiamo un menu.xml con una TexView da usare per la lista del menu (MyMenu.java)
codice:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="10dp"
android:textSize="20sp"
android:textColor="#000000" >
</TextView>
Creiamo poi la classe MyMenu.java che conterrà due voci, “Back” per tornare all’Activity principale, e “Quit” per chiudere l’applicazione.
Nello switch di onListItemClick infatti, vediamo che in “case 0” viene eseguito un semplice this.finish(), mentre in “case 1” (ovvero quando premiamo Quit) viene eseguito setResult(123) e poi this.finish(). setResult(123) serve per impostare un risultato che deve ritornare l’Activity MyMenu quando viene chiusa.
codice:
public class MyMenu extends ListActivity
{
private static final String[] names = new String[]
{
"Back", "Quit"
};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setListAdapter(new ArrayAdapter<String>(this, R.layout.menu, names));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
switch(position)
{
case 0:
this.finish();
break;
case 1:
setResult(123);
this.finish();
}
}
}
Nell’Activity principale, MainActivity.java, creeremo un bottone per avviare l’Activity MyMenu.java, come vediamo non usiamo il classico startActivity, ma startActivityForResult().
Poi scriviamo il metodo onActivityResult che al suo interno controllerà se il resultCode è uguale a 123, quello che abbiamo impostato in MyMenu.java ( setResult(123) ), in caso positivo esegue this.finish(), e quindi chiude l’applicazione.
codice:
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
startActivityForResult(new Intent(getApplicationContext(), MyMenu.class), 0);
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == 123)
{
this.finish();
}
}
}
Ricordiamoci poi di inserire nel manifest.xml i permessi per MyMenu.java.
Tips & Tricks:
Se volete inserire la classica finestra di richiesta conferma per l’uscita dall’applicazione, vi basterà inserire il seguente codice in “case 1” (alla pressione del tasto Quit) in MyMenu.java
codice:
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
switch(position)
{
case 0:
this.finish();
break;
case 1:
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Sicuro di voler uscire?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id)
{
setResult(123);
finish();
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
break;
}
}
Fonte del Tutorial: www.startingpixel.com
Download del Sorgente: Link