Autore Topic: Problema con activity in background  (Letto 4239 volte)

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Problema con activity in background
« il: 07 Settembre 2010, 15:47:39 CEST »
0
Ho creato un'applicazione con 2 activity principali.
Appena si apre l'applicazione si entra nella prima activity in cui inserire i propri dati, validati i dati mi rimanda alla seconda activity la quale ogni 15 minuti scambia dati con un server http (il tutto con un async task).
Se io mando in background l'applicazione (per esempio con il tasto home), dai log vedo che ogni 15 minuti riparte il task e comunica con il server. Il problema sorge quando voglio ritornare nella applicazione(quindi cliccando di nuovo sull'icona).in pratica invece di riaprirmi la seconda activity come l'ho lasciata, mi riapre la prima activity o.O .... Per essere chiaro l'applicazione non è crashata mai altrimenti l'avrei visto dai log, e inoltre il servizio in background continua a girare ogni 15 minuti (se fosse crashata o killata l'activity anche il task in background sarebbe morto)

qualche idea riguardo a questo problema? Io avrei pensato di risolvere facendo un controllo all'avvio della prima activity (se era già partita di passare direttamente alla seconda) ma mi sembra una forzatura. Mi serve riuscire a capirlo perchè la mia applicazione deve rimanere quasi sempre in background e quando la si riattiva deve farmi vedere la seconda activity...

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema con activity in background
« Risposta #1 il: 07 Settembre 2010, 16:09:58 CEST »
0
leggendo in giro ho visto un flag che forse potrebbe servirmi "flag_activity_new_task" da quanto ho capito impedisce di fare partire un nuovo task se l'activity era già partita in precedenza. però non sono sicuro se potrebbe essermi utile, e come poterlo utilizzare in caso (in quale delle 2 activity devo impostarlo?)

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema con activity in background
« Risposta #2 il: 07 Settembre 2010, 16:35:55 CEST »
0
Questo è strano... se mandi il backgroud tramite tasto home la seconda activity e poi accedi nuovamente all'applicazione si dovrebbe aprire la seconda attività esattamente come l'hai lasciata.

Questo processo ha una eccezione nel caso in cui il sistema ha killato il processo per necessità di risorse, in quel caso ti riparte la prima activity.

Prova a monitorare il metodo onDestroy della seconda applicazione per vedere se questa viene effettivamente killata.

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema con activity in background
« Risposta #3 il: 07 Settembre 2010, 16:38:02 CEST »
0
l'ho fatto adesso l'override sia di onstop che di ondestroy.
la cosa strana è che il task in background continua ad esistere e non dovrebbe essere se casomai l'activity fosse stata killata....o sbaglio?

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema con activity in background
« Risposta #4 il: 07 Settembre 2010, 16:50:38 CEST »
+1
l'ho fatto adesso l'override sia di onstop che di ondestroy.
la cosa strana è che il task in background continua ad esistere e non dovrebbe essere se casomai l'activity fosse stata killata....o sbaglio?

Se l'applicazione viene killata si, il task muore. Ma se esci dall'activity (compresa la chiamata all'onDestroy dell'activity) questa continua a restare in vita!

Questo, IMHO è uno delle zone d'ombra del framework di android, ovvero quella di associare una applicazione alla classe Activity, cosa del tutto errata!
La classe che rappresenta una applicazione è la classe Application, che può contenere più Activity. Quando si dice "killare da task manager" si intende fare il kill di una Application, non di una Activity (n.b. killando una application si killano anche tutti i servizi ad essa associati: Activity, Service, Broadcast Receiver e Content Provider).

Fino a quando non viene eseguito il kill dell'application tutti i thread ad essa associata (quindi gli handler, async task, ecc...) restano in vita.

Si, il Framework è un casino!  :-o

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema con activity in background
« Risposta #5 il: 07 Settembre 2010, 17:01:18 CEST »
0
un pò incasinata la situazione..... cmq è un poco strano.non riesco a capire perchè mi va alla prima activity. La tua spiegazione mi ha dato conferma che non può essere stata killata, altrimenti anche il processo sarebbe stato killato.

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema con activity in background
« Risposta #6 il: 07 Settembre 2010, 17:12:36 CEST »
0
tanto per chiarirmi un pò di più le idee quando viene invocato il metodo finish di una activity vengono killati i task ad essa collegati? e soprattutto il metodo finish quale metodo andrebbe a invocare? onStop, onDestroy o nessuno dei 2?

Tanto per chiarirmi le idee perchè cmq non può invocarsi da solo quel metodo :P

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema con activity in background
« Risposta #7 il: 07 Settembre 2010, 17:17:35 CEST »
0
tanto per chiarirmi un pò di più le idee quando viene invocato il metodo finish di una activity vengono killati i task ad essa collegati?

No. Tutti i thread aperti restano in esecuzione.

e soprattutto il metodo finish quale metodo andrebbe a invocare? onStop, onDestroy o nessuno dei 2?

Dipende: se l'applicazione è visibile vengono chiamati in sequenza onPause, onStop e onDestroy, se l'applicazione non è visibile vengono chiamati onStop e onDestroy.

Maggiori info qui: Application Fundamentals | Android Developers

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema con activity in background
« Risposta #8 il: 07 Settembre 2010, 17:21:13 CEST »
0
quindi se per qualche mistero si chiude l'activity viene sempre invocato il metodo onDestroy() (di cui ho fatto l'override e impostato un log). e allora cosa può essere da me visto che a me non viene mai invocato il metodo onDestroy?... non riesco a capire

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema con activity in background
« Risposta #9 il: 07 Settembre 2010, 17:29:30 CEST »
0
quindi se per qualche mistero si chiude l'activity viene sempre invocato il metodo onDestroy() (di cui ho fatto l'override e impostato un log). e allora cosa può essere da me visto che a me non viene mai invocato il metodo onDestroy?... non riesco a capire

Il metodo onDestroy è uno dei metodi che viene invocato quando richiami il metodo finish dell'Activity. Se non viene mai invocato vuol dire che non hai chiamato il finish.
Fai attenzione che questo non viene invocato nella tua prima activity! Questa, infatti, non viene distrutta ma viene esclusivamente nascosta (viene richiamato solo onPause e onStop). Quando premi il tasto back sulla seconda activity, infatti, ti ritorna la prima (che non viene ricreata tramite onCreate visto che non è mai stata distrutta).

A complicare la faccenda (che già è abbastanza complessa) ti aggiungo anche che il metodo onDestroy non è detto che venga sempre chiamato. In casi estremi, il sistema può richiedere velocemente delle risorse accelerando la chiusura delle applicazioni, non rispettando il ciclo di vita di una Activity ma limitandosi a chiamare esclusivamente il metodo onPause (questa IMHO è una delle cose più schifose che gli ingegneri di google potevano fare!!!)

Aggiungo.

Se il task ti serve esclusivamente quando l'activity è visibile ti consiglio di farlo partire in onStart e terminarlo in onStop.
Se il task ti serve sempre (anche quando l'activity non è visibile) ti consiglio di usare un Service.

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema con activity in background
« Risposta #10 il: 07 Settembre 2010, 17:31:49 CEST »
0
ho appena provato a riaprire l'applicazione da icona e ovviamente mi va nella prima activity........ il metodo onDestroy nel frattempo non è stato mai invocato....

L'override l'ho fatto così

Codice (Java): [Seleziona]
       
        @Override
        public void onStop(){
                Log.e("Applicazione stoppata","onStop Activity2");
                super.onStop();
        }
        @Override
        public void onDestroy(){
                Log.e("Applicazione distrutta","onDestroy Activity2");
                super.onDestroy();             
        }

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema con activity in background
« Risposta #11 il: 07 Settembre 2010, 17:33:53 CEST »
0
ho appena provato a riaprire l'applicazione da icona e ovviamente mi va nella prima activity........

Ma come esci dall'applicazione? (n.b.: uscire tramite tasto HOME è diverso da uscire tramite BACK, il primo nasconde l'activity, il secondo la termina).

Puoi postare l'AndroidManifest.xml?

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema con activity in background
« Risposta #12 il: 07 Settembre 2010, 17:36:37 CEST »
0
Il metodo onDestroy è uno dei metodi che viene invocato quando richiami il metodo finish dell'Activity. Se non viene mai invocato vuol dire che non hai chiamato il finish.
Fai attenzione che questo non viene invocato nella tua prima activity! Questa, infatti, non viene distrutta ma viene esclusivamente nascosta (viene richiamato solo onPause e onStop). Quando premi il tasto back sulla seconda activity, infatti, ti ritorna la prima (che non viene ricreata tramite onCreate visto che non è mai stata distrutta).

A complicare la faccenda (che già è abbastanza complessa) ti aggiungo anche che il metodo onDestroy non è detto che venga sempre chiamato. In casi estremi, il sistema può richiedere velocemente delle risorse accelerando la chiusura delle applicazioni, non rispettando il ciclo di vita di una Activity ma limitandosi a chiamare esclusivamente il metodo onPause (questa IMHO è una delle cose più schifose che gli ingegneri di google potevano fare!!!)

Aggiungo.

Se il task ti serve esclusivamente quando l'activity è visibile ti consiglio di farlo partire in onStart e terminarlo in onStop.
Se il task ti serve sempre (anche quando l'activity non è visibile) ti consiglio di usare un Service.



il problema è che io non lo premo il tasto back, io lascio attiva la seconda activity e mi ritrovo nella prima...

il metodo finish lo invoco alla pressione di una opzione del menù e lì funziona correttamente. Il task mi serve sempre. avevo pensato di usare un service, ma non ho capito come farlo interagire con la UI della mia activity (non ci ho perso più di tanto tempo), ma nel frattempo ho lasciato un task.

quello che non capisco è che l'applicazione non viene mai killata (anche perchè non ce ne sarebbe motivo visto che non ho niente di attivo e tutta la ram libera), a dimostrazione del fatto che il task continua sempre a girare.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema con activity in background
« Risposta #13 il: 07 Settembre 2010, 17:40:37 CEST »
0
Con che intent fai partire la seconda activity?

Offline zerocool87

  • Utente junior
  • **
  • Post: 131
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Htc Legend
  • Sistema operativo:
    Ubuntu 10.04
Re:Problema con activity in background
« Risposta #14 il: 07 Settembre 2010, 17:40:46 CEST »
0
io non esco dall'applicazione, ma la metto in background con il tasto home e quindi dovrebbe rientrarmi dove l'ho lasciata nel momento in cui la riapro.

tanto per aggiungere nuove informazioni ho fatto una prova e succede una cosa strana. se riapro l'applicazione dopo 10 o 20 minuti che l'ho messa in background questa mi ritorna nella activity2, se lo faccio dopo un'ora mi si apre la prima activity.....  o_O o_O o_O

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="prova.http_client"
     android:versionCode="1"
     android:versionName="1.0">
    <application  android:name=".MyApplication" android:icon="@drawable/icon" android:label="@string/app_name" android:persistent="true">
        <activity android:name=".http_client"
                 android:label="@string/app_name" android:configChanges="orientation|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    <activity android:name="activity2">
</activity>
<activity android:name="Tabs3" android:configChanges="orientation|keyboardHidden"></activity>
<activity android:name="preferenze" android:screenOrientation="portrait"></activity>
<activity android:name="tab_history"></activity>
</application>
    <uses-sdk android:minSdkVersion="7" />

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
</manifest>