Stänga ner hela applikationen (med flera aktiviteter igång samtidigt)

Diskussion i 'Frågor, support och diskussion' startad av johle, 26 sept 2010.

  1. johle

    johle Kid Droid Medlem

    Blev medlem:
    8 jun 2010
    Inlägg:
    35
    Mottagna gillanden:
    0

    MINA ENHETER

    Hejsan,

    Jag har en applikation med ett liknande upplägg som Spotify.

    När programmet startas ses en login-ruta och i bakgrunden syns själva huvudprogrammet. Detta sker genom att första starta huvudprogrammet och sedan skapa en Intent som startar login-aktiviteten. Nu vet jag dock inte hur jag ska lösa "back"-situationen vid inloggningen.

    Som det är nu så stängs ju bara login-aktiviteten ner och huvudprogrammet syns. Detta ska såklart inte kunna ske eftersom det krävs att man är inloggad för att gå vidare. Jag vill således trigga en nedstängning av både huvudprogrammet OCH login-aktiviteten vid tryck på back när login-aktiviteten är i fokus.

    Är detta sätt att jobba helt fel kanske? Några tips?

    Jag vet ju hur man stänger ner en aktivitet inifrån den aktuella, men jag vill stänga ner hela stacken förknippad med programmet, om ni förstår vad jag menar. :o

    Alla tips är välkomna!

    Tack på förhand!

    MVH

    Johan
     
  2. Zooklubba

    Zooklubba Android Medlem

    Blev medlem:
    10 jul 2010
    Inlägg:
    6 448
    Mottagna gillanden:
    2 199

    MINA ENHETER

    Har bara latjat runt med finish() och det låter som om det inte är det du vill.

    Det är väl just det som är hela grejen att man inte ska behöva hålla på så och stänga ner hela stacken etc? Har själv försökt hitta liknande lösningar men aldrig funnit något.

    En idé är väl att ha en preferens som är en boolean som säger om man är berättigad att gå till sidan eller inte(den sätts true när man loggar in men sätts till false så fort man trycker på back). Så går man back sätts den till false och i huvudprogrammet så dör den eller så står det helt enkelt logga in?

    Vet inte om jag förstått din fråga rätt men så jag förstår det så bör det gå att lösa på det sättet. Att du kör din egen preference och en editor där du ex putBoolean. Går väl att köra med timestamps och sånt också om man vill göra det lite säkrare.
    Lär väl finnas fler sätt att lösa problemet men hoppas mina små ord kanske tar dig nånstans på vägen.
     
  3. yrara

    yrara Teen Droid Medlem

    Blev medlem:
    30 sept 2009
    Inlägg:
    428
    Mottagna gillanden:
    8

    MINA ENHETER

    Du kan starta login-aktiviteten med startActivityForResult istället. Då kan du köra setResult när man loggar in, och kolla efter det i huvudaktiviteten vid onActivityResult.
     
  4. PatrikS

    PatrikS Senior Droid Medlem

    Blev medlem:
    29 jun 2009
    Inlägg:
    1 123
    Mottagna gillanden:
    65

    MINA ENHETER

    Man kan även intercepta back-knappen med följande :

    Kod:
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)  {
            //det du vill göra, kanske stänga ner hela applikationen om användaren inte är inloggad
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    
    
     
  5. johle

    johle Kid Droid Medlem

    Blev medlem:
    8 jun 2010
    Inlägg:
    35
    Mottagna gillanden:
    0

    MINA ENHETER

    Hmm, båda tipsen var iofs intressanta. Men, om jag förstår dem rätt, så kan ingen av dem stänga ner alla öppna aktiviteter samtidigt, eller?

    T.ex. följande scenario.

    Jag startar appen, huvudprogrammet startar en aktivitet som direkt startar login-aktiviteten ovanpå (så båda körs samtidigt, som t.ex. login i Spotify). Sen trycker jag på BACK i login-aktiviteten, som ligger högst upp i stacken. Då vill jag stänga BÅDE login- och huvudaktiviteten.

    Är detta möjligt? :o
     
  6. tomas_b

    tomas_b Kid Droid Medlem

    Blev medlem:
    23 mar 2010
    Inlägg:
    97
    Mottagna gillanden:
    4

    MINA ENHETER

    Men om du i din huvudapp startar din login aktivitet med startActivityForResult och i login aktiviteten sätter setResult(RESULT_CANCEL) (eller vad det nu är, skriver från minnet) och i din huvudaktivitets onActivityResult kollar om resultatet är cancel så gör du bara finish på den, så är båda stängda
     
  7. johle

    johle Kid Droid Medlem

    Blev medlem:
    8 jun 2010
    Inlägg:
    35
    Mottagna gillanden:
    0

    MINA ENHETER


    Ahhh! Tack, nu klarnade det! Det ska jag definitivt prova direkt! :D
     
  8. johle

    johle Kid Droid Medlem

    Blev medlem:
    8 jun 2010
    Inlägg:
    35
    Mottagna gillanden:
    0

    MINA ENHETER

    Hmm... Nu fungerar det visserligen precis som jag vill det. MEN!

    Den första aktiviteten renderar aldrig upp sitt GUI innan login-aktiviteten startar. Så bakgrunden är helt svart ändra tills login-aktiviteten returnerar sitt "resultat". Först då renderas GUIt.

    Någon som har en aning om varför det skulle vara så?

    Såhär startar jag login-aktiviteten:

    Kod:
    	private void startLoginActivity ()
    	{
    		Intent loginIntent = new Intent(MyActivity.this, LoginActivity.class);
    //		MyActivity.this.startActivity(loginIntent);
    		MyActivity.this.startActivityForResult(loginIntent, LOGIN_CODE);
    	}
    
    Det räcker med att jag byter och kommenterar ut den undra raden istället, så renderas det korrekt, men så fungerar det såklart inte med cancel osv. :(

    Nån idé?
     
  9. Pazzo

    Pazzo Youth Droid Medlem

    Blev medlem:
    22 dec 2009
    Inlägg:
    200
    Mottagna gillanden:
    5

    MINA ENHETER

    Det du borde gjort från början är att starta med loginrutan och låta den starta huvudprogrammet, precis innan den dör av en finish.
     
  10. johle

    johle Kid Droid Medlem

    Blev medlem:
    8 jun 2010
    Inlägg:
    35
    Mottagna gillanden:
    0

    MINA ENHETER

    Hm, mja, jo... Visst det går ju att göra. Men om du tänker dig Spotify, där ser man ju huvudprogrammet i bakgrunden, även om man inte har loggat in. Att bara ha en login-ruta och svart bakgrund är ju rätt trist :/

    Jag menar såhär:
    http://files.lennefalk.com/spotify_login.png
     
  11. yrara

    yrara Teen Droid Medlem

    Blev medlem:
    30 sept 2009
    Inlägg:
    428
    Mottagna gillanden:
    8

    MINA ENHETER

    När du startar med startActivityForResult, så kommer den att vänta på resultat. Så du får se till att hela parent-activityn har renderat när du gör anropet.

    Var anropar du startLoginActivity idag?
     
  12. johle

    johle Kid Droid Medlem

    Blev medlem:
    8 jun 2010
    Inlägg:
    35
    Mottagna gillanden:
    0

    MINA ENHETER

    Hm... Just nu kör jag den i onStart, vilket ska köras efter onCreate enligt life cycle-modellen right? (Hade ursprungligen i onResume, men onStart verkar mer logiskt?)

    Men min huvudaktivitet renderas inte innan login-rutan startas :o
     
  13. tomas_b

    tomas_b Kid Droid Medlem

    Blev medlem:
    23 mar 2010
    Inlägg:
    97
    Mottagna gillanden:
    4

    MINA ENHETER

    En annan möjlighet är att göra din login activity som en "vanlig" dialog, fast med custom layout. D.v.s att i din huvud aktivitet impl. onCreateDialog och typ sist i din onCreate/start/resume/whatevs då anropa showDialog.
     
  14. johle

    johle Kid Droid Medlem

    Blev medlem:
    8 jun 2010
    Inlägg:
    35
    Mottagna gillanden:
    0

    MINA ENHETER

    Tack för alla svar!

    Det visade sig nu att allt faktiskt fungerade som det ska. Dock så renderar inte HTC Legend bakgrundsaktiviteten i detta fall. Jag provade på en HTC Desire och då såg det finemang ut! :)

    Tack igen för alla svar! Mycket hjälpsamt, som alltid!

    Ha en fortsatt trevlig söndag! :)

    MVH

    // Johan