2009-07-29 10 views
7

Używam pojedynczej klasy statycznej w moim kodzie, która definiuje pole statyczne, które używam między wywołaniami Activity onStop/onStart. Oto scenariusz:Czy bezpieczny system statyczny w systemie Android?

  1. Użytkownik klika na „Autoryzacja” przycisk (dane statyczne jest inicjowany)
  2. aktywny jest zatrzymany i przeglądarka nazywa
  3. Przeglądarka wykonuje zwrotnego i działalność zostanie przywrócona (dane statyczne jest wykorzystywany)

przynajmniej jeden z moich użytkowników zgłasza awarię w kroku 3, które I nie można odtworzyć, ale który wygląda jak resetu danych statycznych

Wszelkie sugestie?

Odpowiedz

10

To nie jest bezpieczne. Twój proces może zostać zabity między onStop i onStart, więc wszystkie statyczne dane znikną. W rzeczywistości twoja aktywność może nawet zostać zabita, zanim trafi on onStop. W twoich testach proces nie został zabity, ale był dla użytkownika. Zobacz cykl Android activity life, który ma ładny schemat pokazujący możliwości.

Musisz przechowywać dane w inny sposób, na przykład w prefsach lub bazie danych.

+0

Dzięki Heikki. Myślę, że wiem, co robić w tym momencie. – Bostone

+1

Heikki, co myślisz o umieszczeniu statycznego var w kontekście aplikacji? Czy to jest bezpieczne w ten sposób? –

+1

To powinno być bezpieczne, ale nie widzę sensu w tworzeniu statycznego var obiektu, który żyje tak długo, jak proces jest żywy. Normalny var powinien wystarczyć zarówno w kontekście aplikacji, jak iw samym obiekcie aplikacji. –

0

Jeśli te statyczne dane są związane z działaniem, które właśnie zatrzymałeś - możesz użyć normalnych niestatycznych pól + metody SaveSstanceState.

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    // ... save your Serializable data here in outState bundle 
    super.onSaveInstanceState(outState); 
} 

Sprawa byłaby:

  1. zamknąć swoją aktywność i przejdź do przeglądarki (OnStop jest wywoływany) System
  2. zabija swój proces aplikacji (onSaveInstanceState jest wywoływana gdzie można zapisać dane)
  3. Użytkownik przechodzi z powrotem do swojej aktywności (onCreate wywoływana jest za pomocą parametru savedInstanceState)

W większości przypadków drugi punkt nie występuje. System może, ale nie musi, zabijać procesu aplikacji. Jeśli tak się nie stanie - nie otrzymasz metody Utwórz, ale metody onStart i onResume, a twoje pola pozostaną niezmienione.

Powiązane problemy