2012-05-10 14 views
5

Sto lavorando a un'applicazione che ha alcune attività. Un'attività inizia la successiva. Per condividere alcuni valori, sto utilizzando un'implementazione personalizzata dell'applicazione (sto parlando di android.app.Application) denominata MyApplication.
Come tutti sappiamo, il sistema Android uccide un'app, se ha bisogno di più spazio. Ma questo porta ad un problema:
Il contesto dell'applicazione viene ucciso ma l'attività non è

  • apro la mia app e utilizzarlo come qualsiasi altra applicazione
  • chiudo esso (tasto HOME) e utilizzare altre applicazioni
  • Il sistema ucciderà la mia domanda perché è spreco di memoria
  • Quando riapro la mia app, si vuole aprire l'ultima attività che ho usato e ottengo una forza vicino, perché i valori in MyApplication sono nulli

la cosa strana è che il destr sistema oys my Application, ma sembra che mantenga l'attività. Non capisco davvero perché è così perché l'applicazione non sembra avere un ciclo di vita.

Cosa voglio avere:
Quando MyApplication (intera applicazione, non solo l'attività) viene uccisa, voglio che anche l'ultima attività venga uccisa. Quindi quando riapro l'app, avvia l'attività principale fornita da manifest.xml.
o
I valori in MyApplication sono persistenti e non si perdono se l'applicazione viene distrutta. (Sto parlando di alcuni oggetti quindi penso che le preferenze condivise non funzioneranno).
Non desidero utilizzare un servizio per associare le mie attività, ma esiste un modo simile per comunicare al sistema che la mia ultima attività utilizzata dipende dal contesto dell'applicazione?

Spero che tu capisca qual è il mio problema e qualcuno mi può aiutare con questo.

+0

mi piace come nessuna delle risposte sembra riferirsi all'utilizzo di un'applicazione personalizzata anche se si nota chiaramente il suo uso: /). Hai provato a utilizzare Application.ActivityLifecycleCallbacks a tutti, non sono sicuro se questo è quello che stai cercando di realizzare anche (sembra che potresti aver bisogno della direzione inversa). – MikeIsrael

+0

Penso che tu ti stia riferendo a ** Storia dello stack di attività **, rito? – waqaslam

+0

Grazie MikeIsrael hai ragione. Le risposte qui sotto non si riferiscono al mio problema. Utilizzare l'Activity Lifecycle è solo una soluzione. Preferirei che l'applicazione potesse gestire le sue attività e ucciderle se l'intera applicazione viene uccisa. La cronologia dello stack delle attività gestisce invece il comportamento del pulsante di ritorno del mio problema. Sono sicuro che questo è un problema di applicazione, non un problema di attività. – joshplusa

risposta

1

Il modo corretto di fare le cose sarebbe quello di salvare lo stato dell'applicazione. Sostituire il metodo onSaveInstanceState (Bundle savedInstanceState) per salvare lo stato e onRestoreInstanceState per recuperarlo.

Se è necessario salvare grandi insiemi di dati è consigliabile utilizzare un database SQL

+0

Grazie per il Tipp ma come ho scritto nel mio post, questo non funziona per me. Per quanto ho capito, non posso salvare i miei oggetti nello stato delle applicazioni. – joshplusa

+0

Quindi la mia ipotesi migliore sarebbe quella di utilizzare un database SQL per salvare gli oggetti – Ika

+0

OK. Dò un'occhiata più da vicino qual è il modo migliore per risolvere il mio problema. Grazie per l'aiuto! – joshplusa

0

È necessario assicurarsi l'applicazione si chiude e riavvia il modo in cui si vuole che nei metodi onPause(), onResume() e onStop(). Scopri savedInstanceState che può salvare lo stato della app (e ripristinarla, quando viene inviata come parametro per onCreate)

+0

Grazie, ma parlo dell'applicazione non dell'attività. – joshplusa

+0

@joshplusa Stavi parlando di entrambi e volevi che l'attività principale fosse avviata riprendendo dopo onStops(), giusto? – keyser

+0

Sì. Al momento sto controllando i miei valori in onResume(). Se sono nulli, finisco l'app. In questo modo arriverò all'attività principale in qualsiasi momento. Ma è un po 'sporco. Forse dovrei dare un'occhiata più da vicino alla cronologia degli stack di attività. Grazie per la risposta! – joshplusa

0

Nell'implementazione personalizzato di applicazione, aggiungere una bandierina dicono:

public boolean appContextExist = false; 

Sul prima Attività impostato il flag su true,

Override onCreate e il metodo sulla vostra attività che hanno bisogno di contesti onResume, aggiungete quanto segue:

MyApplication myApp = ((MyApplication) getApplicationContext()); 
if (!myApp.appContextExist) { 
    // Code to return to start activity here 
} 
Problemi correlati