Autore Topic: Mantenere una sola istanza dell'Activity nello stack  (Letto 634 volte)

Offline Pask85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Sistema operativo:
    Windows 7
Mantenere una sola istanza dell'Activity nello stack
« il: 11 Febbraio 2012, 21:54:40 CET »
0
Salve a tutti,
vi spiego il mio problema , che non riguarda strettamente il codice ma la logica di navigazione tra activity:

io ho due Activity, A e B, da A a B posso passarci solo tramite la pressione di un tasto, da B ad A posso passarci con la pressione di un tasto e sia con il tasto back del cellulare.
Quindi immaginiamo questo scenario:

A click->B click->A click-> B back->A

A questo punto nel mio stack ci sarà:

A ( activity attiva)
A
B
A

Quindi se premessi nuovamente back mi ritroverei ancora su A, se lo premerei una nuova volta ritornerei su B per poi tornare nuovamente su A.

A questo punto potrei eliminare dallo stack B inserendo la chiamato al metodo onfinish() quando premi il pulsante per richiamare A. Ma come fare per avere una sola istanza di A nello stack ?
Non posso inserire la chiamata al metodo onfinish() quando si richiama B poichè se dovessi premere il tasto back quando sono su B uscirei dall'applicazione senza tornare su A.

Qualcuno mi può aiutare a comprendere la corretta logica da applicare ?

Grazie.

Offline xWOLKx

  • Utente junior
  • **
  • Post: 72
  • Adoro quella citazione western!
  • Respect: +7
    • xWOLKx
    • Wolkrasgt
    • Mostra profilo
    • ZondeIT
  • Dispositivo Android:
    Samsung Galaxy Ace
  • Sistema operativo:
    Windows7
Re:Mantenere una sola istanza dell'Activity nello stack
« Risposta #1 il: 11 Febbraio 2012, 22:40:13 CET »
0
se hai solo 2 pagine forse puoi mettere il noHistory e risolvere, sarebbe da ragionarci :P
Codice (Java): [Seleziona]
<activity android:name="Activity" android:noHistory="true"></activity>

Offline Brig

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Ubuntu 10.4, Windows 7
Re:Mantenere una sola istanza dell'Activity nello stack
« Risposta #2 il: 12 Febbraio 2012, 08:37:00 CET »
0
se metti
Codice (Java): [Seleziona]
finish()in B ti dovrebbe "morire" sempre e ritornare sull'unica A...

ovvero
A -> B -> (finish()) -> A

Offline Doc_cheilvenerdi.org

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: +1
    • Google+
    • ACervellati
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Next GT-S5570
  • Sistema operativo:
    Gentoo Amd64 no-multilib
Re:Mantenere una sola istanza dell'Activity nello stack
« Risposta #3 il: 12 Febbraio 2012, 09:08:13 CET »
+1
Io ho risolto un problema analogo (chiamate reciproche tra 3 activity) settando, per ognuna di loro, nell'Android Manifest l'attributo launchmode uguale a singleInstance; ad esempio così:

Codice (XML): [Seleziona]
...
        <activity
           android:name=".ReverseTethering"
           android:label="@string/app_name"
           android:theme="@android:style/Theme.NoTitleBar"
           android:launchMode="singleInstance" >
...

Offline Pask85

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S Plus
  • Sistema operativo:
    Windows 7
Re:Mantenere una sola istanza dell'Activity nello stack
« Risposta #4 il: 12 Febbraio 2012, 09:41:29 CET »
0
Settando il nohistory credo che non risolverei il problema perchè mi servirebbe almeno un'istanza di A.

Inserendo finish() su B mi eliminerebbe solo le istanze di B e non quella nuova di A. ( ALmeno credo).

Adesso provo ad inserire il launchMode a singleInstance.

Magari così risolvo.

Grazie a tutti.

Offline Brig

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S
  • Sistema operativo:
    Ubuntu 10.4, Windows 7
Re:Mantenere una sola istanza dell'Activity nello stack
« Risposta #5 il: 13 Febbraio 2012, 22:20:03 CET »
0
Io in due minuti ho provato questo...
A viene risvegliata dopo essere stata messa da parte per far posto a B... se non dico una cavolata...

Activity1
Codice (Java): [Seleziona]
package com.provafinish;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.TextView;
import android.widget.Toast;

public class Activity1 extends Activity {
        double d = -1;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ((TextView) findViewById(R.id.tv)).setText("Press MENU to start second Act");
    }
   
    @Override
    protected void onResume() {
        super.onResume();
        Toast.makeText(this, "d = " + d, Toast.LENGTH_SHORT).show();
        if(d == -1){
                d = Math.random();
            Toast.makeText(this, "d == -1: ora d = " + d, Toast.LENGTH_SHORT).show();
        }else
                Toast.makeText(this, "d != -1", Toast.LENGTH_LONG).show();
    }
   
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_MENU){
                startActivity(new Intent(Activity1.this, Activity2.class));
                return true;
        }else if(keyCode == KeyEvent.KEYCODE_BACK){
                finish();
                return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

Activity2
Codice (Java): [Seleziona]
package com.provafinish;

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.TextView;

public class Activity2 extends Activity{
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ((TextView) findViewById(R.id.tv)).setText("Press BACK to close this Act");
    }
   
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK){
                finish();
                return true;
        }
        return super.onKeyDown(keyCode, event);
    }

}