Il Forum è consultabile solo in modalità lettura. Per domande o consigli iscriviti al nostro GRUPPO FACEBOOK / COMMUNITY cliccando qui

[Guida] Chiudere app da activity secondaria

Discussione in 'Development' iniziata da Hhaunted, 29 Lug 2013.

  1. Hhaunted

    Hhaunted Baby Droid

    Iscritto:
    24 Ott 2012
    Messaggi:
    15
    "Mi Piace":
    6
    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
     
    Ultima modifica: 29 Lug 2013
  2. ripazha

    ripazha Baby Droid

    Iscritto:
    26 Giu 2013
    Messaggi:
    20
    "Mi Piace":
    1
    Mollto interessante però io ho un problema.
    apro l' app e appare un activity di benvenuto,dopo tot passa all' activity menu...se faccio indietro mi esce dall' app senza problemi....
    dal momento che passo dal menù a un altra pagina che chiamiamo pagina 2,e da pagina due a pagina 3 , una volta tornato al menù quando faccio per uscire invece di chiudere l' app mi riporta alla pagina 3 / 2 ....
    qualche idea?
    Grazie.
     
  3. Hhaunted

    Hhaunted Baby Droid

    Iscritto:
    24 Ott 2012
    Messaggi:
    15
    "Mi Piace":
    6
    potresti mettere nel manifest.xml, dove sono dichiarate le <activity> di pagina "2" e "3":
    Codice:
    android:noHistory="true"
     
    A ripazha piace questo elemento.
  4. ripazha

    ripazha Baby Droid

    Iscritto:
    26 Giu 2013
    Messaggi:
    20
    "Mi Piace":
    1
    Perfetto!funziona alla perfezione!! ;) grazie del tutorial e della risposta!
     
  5. spoke88kki

    spoke88kki Baby Droid

    Iscritto:
    30 Giu 2013
    Messaggi:
    6
    "Mi Piace":
    0
    ciao, io invece vorrei sapere come si chiude un activity con il metodo onstop o ondestroy, non so quale dei due vada meglio, qualcuno mi può postare un esempio di codice con la migliore delle due opzioni?
    grazie.
     
  6. Crotan

    Crotan Worker Droid

    Iscritto:
    1 Set 2013
    Messaggi:
    81
    "Mi Piace":
    56
    Non esiste un metodo migliore dell'altro poiché vengono richiamati in due contesti diversi. onStop, come dice la parola stessa, quando l'activity viene stoppata, onDestroy quando sta per essere chiusa, "distrutta".

    Inviato dal mio Galaxy Nexus con Tapatalk 2
     
  7. spoke88kki

    spoke88kki Baby Droid

    Iscritto:
    30 Giu 2013
    Messaggi:
    6
    "Mi Piace":
    0
    ok, grazie
    il problema è che non riesco ad implementarli, vi posto il codice così mi dite se va bene e come migliorarlo

    public class MainActivity extends Activity {
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_MainActivity);

    Button btnPrev1=(Button) findViewById(R.id.button_prev1);
    btnPrev1.setOnClickListener(new View.OnClickListener(){
    Override
    public void onClick(View arg0) {
    //Definisco l'intenzione
    Intent openActivity2 = new Intent(MainActivity.this, Activity2.class);
    //Passo all'attivazione dell'activity "nome pagina da aprire"
    startActivity (openActivity2);
    }
    });

    public void onStop() {
    super.onStop();
    //qui non so che codice devo inserire

    }
    }

    in pratica il mio problema è che quando scorro le immagini dopo un po', circa alla settima immagine, il sistema mi va in crash e penso che il problema sia dovuto al fatto che le altre immagini rimangano attive occupando risorse
    Cosa mi proponete di fare?
    Grazie
     
  8. Crotan

    Crotan Worker Droid

    Iscritto:
    1 Set 2013
    Messaggi:
    81
    "Mi Piace":
    56
    Posta il logcat, altrimenti é molto difficile risalire alla causa del problema.

    Inviato dal mio Galaxy Nexus con Tapatalk 2
     
  9. spoke88kki

    spoke88kki Baby Droid

    Iscritto:
    30 Giu 2013
    Messaggi:
    6
    "Mi Piace":
    0
    questo è il log, in pratica l'errore parte perchè il sistema non ha più memoria

    java.lang.RuntimeException: Unable to start activity ComponentInfo{storia.mussloni/storia.mussloni.Banda}: android.view.InflateException: Binary XML file line #52: Error inflating class <unknown>
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
    at android.app.ActivityThread.access$700(ActivityThread.java:135)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4998)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: android.view.InflateException: Binary XML file line #52: Error inflating class <unknown>
    at android.view.LayoutInflater.createView(LayoutInflater.java:620)
    at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
    at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
    at android.app.Activity.setContentView(Activity.java:1928)
    at storia.mussloni.Banda.onCreate(Banda.java:15)
    at android.app.Activity.performCreate(Activity.java:5243)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
    ############at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
    ############at android.app.ActivityThread.access$700(ActivityThread.java:135)
    ############at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
    ############at android.os.Handler.dispatchMessage(Handler.java:102)
    ############at android.os.Looper.loop(Looper.java:137)
    ############at android.app.ActivityThread.main(ActivityThread.java:4998)
    ############at java.lang.reflect.Method.invokeNative(Native Method)
    ############at java.lang.reflect.Method.invoke(Method.java:515)
    ############at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
    ############at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
    ############at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Constructor.constructNative(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    ############at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
    ############at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
    ############at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
    ############at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    ############at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    ############at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    ############at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    ############at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
    ############at android.app.Activity.setContentView(Activity.java:1928)
    ############at storia.mussloni.Banda.onCreate(Banda.java:15)
    ############at android.app.Activity.performCreate(Activity.java:5243)
    ############at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    ############at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
    ############at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
    ############at android.app.ActivityThread.access$700(ActivityThread.java:135)
    ############at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
    ############at android.os.Handler.dispatchMessage(Handler.java:102)
    ############at android.os.Looper.loop(Looper.java:137)
    ############at android.app.ActivityThread.main(ActivityThread.java:4998)
    ############at java.lang.reflect.Method.invokeNative(Native Method)
    ############at java.lang.reflect.Method.invoke(Method.java:515)
    ############at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
    ############at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
    ############at dalvik.system.NativeStart.main(Native Method)
    Caused by: java.lang.OutOfMemoryError
    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:575)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:410)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:840)
    at android.content.res.Resources.loadDrawable(Resources.java:2110)
    at android.content.res.TypedArray.getDrawable(TypedArray.java:602)
    at android.view.View.<init>(View.java:3545)
    at android.widget.ImageView.<init>(ImageView.java:123)
    at android.widget.ImageView.<init>(ImageView.java:119)
    ############at java.lang.reflect.Constructor.constructNative(Native Method)
    ############at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    ############at android.view.LayoutInflater.createView(LayoutInflater.java:594)
    ############at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
    ############at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
    ############at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
    ############at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
    ############at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
    ############at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
    ############at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
    ############at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290)
    ############at android.app.Activity.setContentView(Activity.java:1928)
    ############at storia.mussloni.Banda.onCreate(Banda.java:15)
    ############at android.app.Activity.performCreate(Activity.java:5243)
    ############at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    ############at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
    ############at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
    ############at android.app.ActivityThread.access$700(ActivityThread.java:135)
    ############at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
    ############at android.os.Handler.dispatchMessage(Handler.java:102)
    ############at android.os.Looper.loop(Looper.java:137)
    ############at android.app.ActivityThread.main(ActivityThread.java:4998)
    ############at java.lang.reflect.Method.invokeNative(Native Method)
    ############at java.lang.reflect.Method.invoke(Method.java:515)
    ############at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
    ############at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
    ############at dalvik.system.NativeStart.main(Native Method)
     
  10. Crotan

    Crotan Worker Droid

    Iscritto:
    1 Set 2013
    Messaggi:
    81
    "Mi Piace":
    56
    Secondo me la natura del crash non è quella che dici tu.

    Codice:
    Caused by: android.view.InflateException: Binary XML file line [B]#52[/B]: Error inflating class <unknown>
    Cosa c'è alla linea 52 che potrebbe comportare il crash?
     
  11. spoke88kki

    spoke88kki Baby Droid

    Iscritto:
    30 Giu 2013
    Messaggi:
    6
    "Mi Piace":
    0
    sinceramente non ho idea, in quale activity devo guardare?
     
  12. Crotan

    Crotan Worker Droid

    Iscritto:
    1 Set 2013
    Messaggi:
    81
    "Mi Piace":
    56
    Non saprei, nel LogCat riporta unkown. Ad intuito/esclusione non riusciresti a capire qual'è?
     
  13. spoke88kki

    spoke88kki Baby Droid

    Iscritto:
    30 Giu 2013
    Messaggi:
    6
    "Mi Piace":
    0
    il fatto è che l'errore si presenta solo quando inizio ad aprire le immagini e ho messo un'immagine in ogni activity (non sono riuscito a creare uno slider come si deve), però nessuna di queste activity arriva ad avere 52 righe di codice
     
  14. Crotan

    Crotan Worker Droid

    Iscritto:
    1 Set 2013
    Messaggi:
    81
    "Mi Piace":
    56
    Infatti non devi guardare nelle Activity ma nei loro rispettivi layout XML.
     
  15. spoke88kki

    spoke88kki Baby Droid

    Iscritto:
    30 Giu 2013
    Messaggi:
    6
    "Mi Piace":
    0
    ho riguardato tutti i layout dove ho caricato le immagini, sono quasi 100 e in ognuno alla riga #52 c'è " <ImageView ", nient'altro
     
  16. Crotan

    Crotan Worker Droid

    Iscritto:
    1 Set 2013
    Messaggi:
    81
    "Mi Piace":
    56
    Il problema così come è posto é alquanto strano. Senza una panoramica più ampia non saprei aiutarti. Mi dispiace.

    Inviato dal mio Galaxy Nexus con Tapatalk 2