Jak zadeklarować zmienne globalne w Androidzie?

Tworzę aplikację, która wymaga logowania. Utworzyłem aktywność główną i logowania.

W metodzie głównej aktywności onCreate dodałem następujący warunek:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ...

    loadSettings();
    if(strSessionString == null)
    {
        login();
    }
    ...
}

Metoda onActivityResult wykonywana po zakończeniu formularza logowania wygląda następująco:

@Override
public void onActivityResult(int requestCode,
                             int resultCode,
                             Intent data)
{
    super.onActivityResult(requestCode, resultCode, data);
    switch(requestCode)
    {
        case(SHOW_SUBACTICITY_LOGIN):
        {
            if(resultCode == Activity.RESULT_OK)
            {

                strSessionString = data.getStringExtra(Login.SESSIONSTRING);
                connectionAvailable = true;
                strUsername = data.getStringExtra(Login.USERNAME);
            }
        }
    }

Problem polega na tym, że formularz logowania czasami pojawia się dwa razy (metoda login() jest wywoływana dwa razy), a także gdy klawiatura telefonu przesuwa się, formularz logowania pojawia się ponownie I myślę, że problemem jest zmienna strSessionString.

Czy ktoś wie jak ustawić zmienną global, aby uniknąć pojawiania się formularza logowania po pomyślnym uwierzytelnieniu użytkownika?

Author: Willi Mentzel, 2009-04-02

17 answers

Napisałem tę odpowiedź w 2009 roku, kiedy Android był stosunkowo nowy, a w rozwoju Androida było wiele niezbyt ugruntowanych obszarów. Dodałem długi dodatek na dole tego postu, odnosząc się do pewnej krytyki i szczegółowo opisując filozoficzny spór, jaki mam z użyciem singletonów, a nie podklasowania aplikacji. Przeczytaj na własne ryzyko.

ORYGINALNA ODPOWIEDŹ:

Bardziej ogólnym problemem, z którym się spotykasz, jest to, jak zapisać stan w poprzek kilka czynności i wszystkie części aplikacji. Zmienna statyczna (na przykład singleton) jest powszechnym sposobem osiągnięcia tego w Javie. Odkryłem jednak, że bardziej eleganckim sposobem w Androidzie jest powiązanie stanu z kontekstem aplikacji.

Jak wiadomo, każda czynność jest również kontekstem, czyli informacją o jej środowisku wykonywania w najszerszym tego słowa znaczeniu. Aplikacja ma również kontekst, a system Android gwarantuje, że będzie istnieć jako pojedyncza instancja w całej aplikacji podanie.

Sposobem na to jest stworzenie własnej podklasy Androida.app.Application , a następnie określ tę klasę w znaczniku application w manifeście. Teraz Android automatycznie utworzy instancję tej klasy i udostępni ją dla całej aplikacji. Możesz uzyskać do niego dostęp z dowolnej metody {[4] } za pomocą metody Context.getApplicationContext() (Activity zapewnia również metodę getApplication(), która ma dokładnie taki sam efekt). Poniżej przedstawiamy niezwykle uproszczony przykład, z zastrzeżeniami do follow:

class MyApp extends Application {

  private String myState;

  public String getState(){
    return myState;
  }
  public void setState(String s){
    myState = s;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyApp appState = ((MyApp)getApplicationContext());
    String state = appState.getState();
    ...
  }
}

Ma to zasadniczo taki sam efekt jak użycie zmiennej statycznej lub Singletona, ale całkiem dobrze integruje się z istniejącym frameworkiem Androida. Zauważ, że nie będzie to działać między procesami (jeśli Twoja aplikacja będzie jednym z rzadkich, które ma wiele procesów).

Coś do odnotowania z powyższego przykładu; załóżmy, że zamiast tego zrobiliśmy coś w stylu:

class MyApp extends Application {

  private String myState = /* complicated and slow initialization */;

  public String getState(){
    return myState;
  }
}

Teraz ta powolna inicjalizacja (np. uderzanie dysku, uderzanie sieci, blokowanie czegokolwiek itp.) będzie być wykonywane za każdym razem, gdy aplikacja jest instancyjna! Możesz pomyśleć, cóż, to tylko raz na proces i tak będę musiał zapłacić koszty, prawda? Na przykład, jak wspomina Dianne Hackborn poniżej, jest całkowicie możliwe, aby twój proces został utworzony-po prostu-w celu obsługi zdarzenia transmisji w tle. Jeśli przetwarzanie transmisji nie ma potrzeby tego stanu, potencjalnie wykonałeś całą serię skomplikowanych i powolnych operacji za nic. Lazy instantiation to nazwa gra tutaj. Poniżej znajduje się nieco bardziej skomplikowany sposób korzystania z aplikacji, który ma większy sens dla wszystkiego, ale najprostszych zastosowań: {]}

class MyApp extends Application {

  private MyStateManager myStateManager = new MyStateManager();

  public MyStateManager getStateManager(){
    return myStateManager ;
  }
}

class MyStateManager {

  MyStateManager() {
    /* this should be fast */
  }

  String getState() {
    /* if necessary, perform blocking calls here */
    /* make sure to deal with any multithreading/synchronicity issues */

    ...

    return state;
  }
}

class Blah extends Activity {

  @Override
  public void onCreate(Bundle b){
    ...
    MyStateManager stateManager = ((MyApp)getApplicationContext()).getStateManager();
    String state = stateManager.getState();
    ...
  }
}

Chociaż wolę podklasowanie aplikacji niż używanie singletonów jako bardziej eleganckiego rozwiązania, wolałbym raczej, aby deweloperzy używali singletonów, jeśli jest to naprawdę konieczne, zamiast w ogóle nie myśleć o wydajności i wielowątkowości implikacji kojarzenia stanu z podklasą aplikacji.

Uwaga 1: również jako anticafe skomentowano, aby poprawnie powiązać nadpisanie aplikacji z aplikacją niezbędny jest znacznik w pliku manifestu. Ponownie Zobacz dokumenty Android, aby uzyskać więcej informacji. Przykład:

<application
     android:name="my.application.MyApp" 
     android:icon="..."
     android:label="...">
</application>

Uwaga 2: user608578 pyta poniżej, jak to działa z zarządzaniem cyklem życia obiektów natywnych. Nie jestem na bieżąco z używaniem kodu natywnego z Androidem w najmniejszym stopniu i nie mam kwalifikacji, aby odpowiedzieć na pytanie, w jaki sposób miałoby to współdziałać z moim rozwiązaniem. Jeśli ktoś ma na to odpowiedź, jestem gotów zapisz je i umieść informacje w tym poście, aby uzyskać maksymalną widoczność.

Dodatek:

Jak zauważyli niektórzy, jest to , a nie rozwiązanie dla uporczywego państwa, co być może powinienem był bardziej podkreślić w oryginalnej odpowiedzi. Nie ma to być rozwiązanie do zapisywania użytkownika lub innych informacji, które mają być przechowywane przez cały okres życia aplikacji. Tak więc, uważam większość krytyki poniżej związane z aplikacji jest zabity w każdej chwili, itp..., nie ma znaczenia, ponieważ wszystko, co kiedykolwiek musiało zostać zapisane na dysku, nie powinno być przechowywane przez podklasę aplikacji. Ma to być rozwiązanie do przechowywania tymczasowego, łatwego do ponownego utworzenia stanu aplikacji (na przykład, czy użytkownik jest zalogowany) oraz komponentów, które są pojedynczymi instancjami (na przykład menedżer sieci aplikacji) (, a nie singleton!) w naturze.

Dayerman był na tyle uprzejmy, że zwrócił uwagę na ciekawą rozmowę z Reto Meierem i Dianne Hackborn , w której nie zaleca się używania podklas aplikacji na rzecz wzorców Singletona. Somatik zwrócił też uwagę na coś takiego wcześniej, chociaż wtedy tego nie widziałem. Ze względu na role Reto I Dianne w utrzymaniu Platformy Android, nie mogę w dobrej wierze zalecać ignorowania ich rad. To, co mówią, idzie. Chciałbym nie zgodzić się z opiniami wyrażonymi w odniesieniu do preferowania podklas Singleton niż aplikacji. W mojej sprzeczności będę korzystaj z pojęć najlepiej wyjaśnionych w to Wyjaśnienie StackExchange wzoru projektowego Singleton , aby nie musiał definiować terminów w tej odpowiedzi. Gorąco zachęcam do zapoznania się z linkiem przed kontynuacją. Punkt po punkcie:

Dianne stwierdza: "nie ma powodu, aby podklasować z aplikacji. To nie różni się od tworzenia Singletona..."To pierwsze twierdzenie jest nieprawidłowe. Istnieją dwa główne powody tego. 1) klasa aplikacji zapewnia lepszą dożywotnią gwarancję dla programisty aplikacji; gwarantowana jest żywotność aplikacji. Singleton nie jest bezpośrednio związany z żywotnością aplikacji (chociaż faktycznie jest). Może to nie być problem dla przeciętnego dewelopera aplikacji, ale powiedziałbym, że jest to dokładnie taki rodzaj umowy, jaki powinien oferować Android API i zapewnia znacznie większą elastyczność systemu Android, minimalizując żywotność powiązanych danych. 2) Klasa aplikacji zapewnia programista aplikacji z posiadaczem pojedynczej instancji dla stanu, który bardzo różni się od posiadacza pojedynczego stanu. Lista różnic znajduje się w linku wyjaśniającym Singleton powyżej.

Dianne kontynuuje:"...prawdopodobnie będzie to coś, czego będziesz żałował w przyszłości, gdy odkryjesz, że obiekt aplikacji staje się tym wielkim poplątanym bałaganem tego, co powinno być niezależną logiką aplikacji."Z pewnością nie jest to błędne, ale nie jest to powód wyboru Singleton zamiast aplikacji podklasa. Żaden z argumentów Diane nie podaje powodu, że używanie Singletona jest lepsze niż podklasa aplikacji, jedyne co stara się ustalić, to to, że używanie Singletona nie jest gorsze niż podklasa aplikacji, co moim zdaniem jest fałszywe. Kontynuuje: "i to prowadzi bardziej naturalnie do tego, jak powinieneś zarządzać tymi rzeczami-inicjować je na żądanie."Ignoruje to fakt, że nie ma powodu, dla którego nie można inicjować na żądanie za pomocą podklasy aplikacji. Again nie ma różnicy.

Dianne kończy się słowami: "sam framework ma mnóstwo singletonów dla wszystkich małych współdzielonych danych, które utrzymuje dla aplikacji, takich jak bufory załadowanych zasobów, pule obiektów itp. Działa świetnie."Nie twierdzę, że używanie singletonów nie może działać dobrze lub nie jest uzasadnioną alternatywą. Argumentuję, że Singletony nie zapewniają tak silnej umowy z systemem Android jak korzystanie z podklasy aplikacji, a ponadto używanie singletonów ogólnie wskazuje na nieelastyczną konstrukcję, która nie jest łatwa do modyfikacji i prowadzi do wielu problemów na drodze. IMHO, silny kontrakt Android API oferuje deweloperom aplikacji jest jednym z najbardziej atrakcyjnych i przyjemnych aspektów programowania z Androidem i pomógł doprowadzić do wczesnego przyjęcia dewelopera, który doprowadził platformę Android do sukcesu, jaki ma dzisiaj. Sugerowanie używania singletonów jest w domyśle odejściem od mocnego kontraktu API i moim zdaniem osłabia Androida ramy.

Dianne skomentowała również poniżej, wspominając o dodatkowym minusie korzystania z podklas aplikacji, mogą one zachęcić lub ułatwić pisanie kodu o mniejszej wydajności. Jest to bardzo prawdziwe, i edytowałem tę odpowiedź, aby podkreślić znaczenie rozważania perf tutaj, i biorąc poprawne podejście, jeśli używasz podklasowania aplikacji. Jak stwierdza Dianne, ważne jest, aby pamiętać, że klasa aplikacji będzie tworzona za każdym razem, gdy proces zostanie załadowany (może być wiele razy na raz, jeśli aplikacja działa w wielu procesach!) nawet jeśli Proces jest ładowany tylko dla zdarzenia transmisji w tle. Dlatego ważne jest, aby używać klasy aplikacji bardziej jako repozytorium dla wskaźników do współdzielonych komponentów aplikacji, a nie jako miejsca do przetwarzania!

Zostawiam ci następującą listę minusów singletonów, skradzionych z wcześniejszego linku StackExchange:

  • niemożność użycia abstrakcji or interface classes;
  • niemożność podklasowania;
  • wysokie sprzężenie w całej aplikacji (trudne do modyfikacji);
  • Jest to bardzo trudne do przetestowania (nie można udawać/naśmiewać się w testach jednostkowych); [70]} Nie jest to jednak żaden problem, ponieważ nie jest to możliwe.]}

I dodaj własne:

    W 2007 roku firma została założona przez firmę Microsoft, która od 2007 roku zajmuje się produkcją i dystrybucją oprogramowania dla Androida.]}
 938
Author: sooniln,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 07:31:17

Utwórz tę podklasę

public class MyApp extends Application {
  String foo;
}
W AndroidManifest.xml add android: name

Przykład

<application android:name=".MyApp" 
       android:icon="@drawable/icon" 
       android:label="@string/app_name">
 152
Author: ebuprofen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-22 10:06:06

Sugerowany przez Soonil sposób zachowania stanu aplikacji jest dobry, jednak ma jeden słaby punkt - zdarzają się przypadki, gdy system operacyjny zabija cały proces aplikacji. Oto dokumentacja na ten temat - procesy i cykle życia .

Rozważ przypadek - Twoja aplikacja idzie w tle, ponieważ ktoś dzwoni do Ciebie(aplikacja telefonu jest teraz na pierwszym planie). W tym przypadku & & pod pewnymi innymi warunkami (sprawdź powyższy link, Co to może być) System Operacyjny może zabić proces aplikacji, w tym instancję Application podklasy. W rezultacie państwo jest stracone. Gdy później wrócisz do aplikacji, system operacyjny przywróci swój stos aktywności i instancję podklasy Application, jednak pole myState będzie null.

AFAIK, jedynym sposobem zagwarantowania bezpieczeństwa państwa jest użycie dowolnego rodzaju utrzymywania stanu, np. użycie prywatnego dla pliku aplikacji lub SharedPrefernces (ostatecznie używa prywatnego dla pliku aplikacji w wewnętrznym systemie plików).

 141
Author: Vit Khudenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-25 19:42:03

Tylko notkę ..

Dodaj:

android:name=".Globals"

Czy jak tam nazwałeś swoją podklasę istniejącą <application> tag. Próbowałem dodać kolejny znacznik <application> do manifestu i otrzymałem wyjątek.

 25
Author: Gimbl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-13 21:29:47

Nie mogłem znaleźć, jak określić tag aplikacji, ale po wielu Googlach, stało się to oczywiste z pliku manifest docs: użyj android: name, oprócz domyślnej ikony i etykiety w strofie aplikacji.

Android: nazwa W pełni kwalifikowana nazwa podklasy aplikacji zaimplementowanej dla aplikacji. Gdy proces aplikacji jest uruchomiony, klasa ta jest inicjowana przed którymkolwiek ze składników aplikacji.

Podklasa jest opcjonalna; większość aplikacje nie będą potrzebne. W przypadku braku podklasy, Android używa instancji podstawowej klasy aplikacji.

 13
Author: Mike Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-14 05:26:17

A co z zapewnieniem gromadzenia rodzimej pamięci za pomocą takich globalnych struktur?

Działania mają metodę onPause/onDestroy(), która jest wywoływana po zniszczeniu, ale Klasa aplikacji nie ma odpowiedników. Jaki mechanizm jest zalecany, aby zapewnić, że globalne struktury (zwłaszcza te zawierające odniesienia do pamięci natywnej) są odpowiednio zbierane, gdy aplikacja zostanie zabita lub stos zadań zostanie umieszczony w tle?

 13
Author: user608578,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-22 10:06:47

Wystarczy zdefiniować nazwę aplikacji, jak poniżej, która będzie działać:

<application
  android:name="ApplicationName" android:icon="@drawable/icon">
</application>
 5
Author: Anand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 05:53:45

Tak jak było omówione powyżej system operacyjny mógł zabić aplikację bez żadnego powiadomienia (nie ma zdarzenia onDestroy), więc nie ma możliwości zapisania tych zmiennych globalnych.

SharedPreferences może być rozwiązaniem, z wyjątkiem złożonych zmiennych strukturalnych(w moim przypadku miałem tablicę integer do przechowywania identyfikatorów, które użytkownik już obsługiwał). Problem z SharedPreferences polega na tym, że trudno jest przechowywać i pobierać te struktury za każdym razem, gdy potrzebne są wartości.

In my przypadek miałem usługę w tle, więc mogłem przenieść tę zmienną tam i ponieważ usługa ma Zdarzenie onDestroy, mogłem łatwo zapisać te wartości.

 4
Author: Adorjan Princz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-02 08:53:25

Jeśli niektóre zmienne są przechowywane w sqlite i musisz ich używać w większości działań w aplikacji. następnie aplikacja może najlepszym sposobem, aby to osiągnąć. Odpytywanie zmiennych z bazy danych po uruchomieniu aplikacji i zapisywanie ich w polu. Następnie możesz użyć tych zmiennych w swoich działaniach.

Więc znajdź właściwą drogę, a nie ma najlepszej drogi.

 4
Author: user716653,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 06:02:52

Możesz mieć statyczne pole do przechowywania tego rodzaju stanu. Lub umieść go w pakiecie zasobów i przywróć stamtąd na onCreate (Bundle savedInstanceState). Po prostu upewnij się, że w pełni rozumiesz cykl życia zarządzanych aplikacji na Androida (np. dlaczego login() jest wywoływany przy zmianie orientacji klawiatury).

 3
Author: yanchenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-02 02:19:44

Nie używaj innego znacznika <application> w pliku manifestu.Po prostu zrób jedną zmianę w istniejącym znaczniku <application>, Dodaj tę linię android:name=".ApplicationName", gdzie ApplicationName będzie nazwą Twojej podklasy(używanej do przechowywania globalnej), którą masz zamiar utworzyć.

Więc w końcu twój JEDEN i jedyny <application> znacznik w pliku manifestu powinien wyglądać tak:-

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.NoActionBar"
        android:name=".ApplicationName"
        >
 2
Author: kumar kundan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-22 11:20:42

Można to zrobić za pomocą dwóch podejść:

  1. użycie klasy aplikacji
  2. Używanie Wspólnych Preferencji

  3. Użycie klasy aplikacji

Przykład:

class SessionManager extends Application{

  String sessionKey;

  setSessionKey(String key){
    this.sessionKey=key;
  }

  String getSessisonKey(){
    return this.sessionKey;
  }
}

Możesz użyć powyższej klasy, aby zaimplementować logowanie w swojej głównej aktywności, jak poniżej. Kod będzie wyglądał mniej więcej tak:

@override 
public void onCreate (Bundle savedInstanceState){
  // you will this key when first time login is successful.
  SessionManager session= (SessionManager)getApplicationContext();
  String key=getSessisonKey.getKey();
  //Use this key to identify whether session is alive or not.
}

Ta metoda będzie działać do tymczasowego przechowywania. Naprawdę nie masz pojęcia, kiedy system operacyjny zabije aplikację, z powodu niskiej pamięć. Gdy aplikacja znajduje się w tle, a użytkownik przechodzi przez inną aplikację, która wymaga większej ilości pamięci do uruchomienia, aplikacja zostanie zabita, ponieważ system operacyjny ma większy priorytet dla procesów pierwszoplanowych niż w tle. Dlatego twój obiekt aplikacji będzie null przed wylogowaniem się użytkownika. Stąd w tym celu zalecam użycie drugiej metody opisanej powyżej.

  1. Używanie wspólnych preferencji.

    String MYPREF="com.your.application.session"
    
    SharedPreferences pref= context.getSharedPreferences(MyPREF,MODE_PRIVATE);
    
    //Insert key as below:
    
    Editot editor= pref.edit();
    
    editor.putString("key","value");
    
    editor.commit();
    
    //Get key as below.
    
    SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
    
    String key= getResources().getString("key");
    
 1
Author: Krishna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-18 08:15:34

Możesz użyć opcji Intents , Sqlite lub Shared Preferences . Jeśli chodzi o przechowywanie multimediów, takich jak dokumenty , zdjęcia i filmy , możesz zamiast tego utworzyć nowe pliki.

 0
Author: Raju yourPepe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-16 01:35:07

Na wynik aktywności jest wywoływany przed na wznowienie. Więc przenieś login check Do po wznowieniu, a drugie logowanie może zostać zablokowane, gdy aktywność secomd zwróci pozytywny wynik. W CV jest wywoływany za każdym razem, więc nie ma obaw, że nie zostanie wywołany po raz pierwszy.

 0
Author: user3044482,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-11 07:36:48

Podejście do podklasowania zostało również wykorzystane przez framework BARACUSA. Z mojego punktu widzenia podklasowanie aplikacja była przeznaczona do pracy z cyklami życia Androida; to właśnie robi każdy kontener aplikacji. Zamiast mieć wtedy globale, rejestruję fasolki w tym kontekście i pozwalam im być wtryskiwanymi do dowolnej klasy zarządzanej przez kontekst. Każda wstrzyknięta instancja fasoli jest singletonem.

Zobacz ten przykład dla szczegółów

Dlaczego wykonujesz prace ręczne, jeśli możesz mieć o wiele więcej?

 0
Author: gorefest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-11 13:01:09
class GlobaleVariableDemo extends Application {

    private String myGlobalState;

    public String getGlobalState(){
     return myGlobalState;
    }
    public void setGlobalState(String s){
     myGlobalState = s;
    }
}

class Demo extends Activity {

@Override
public void onCreate(Bundle b){
    ...
    GlobaleVariableDemo appState = ((GlobaleVariableDemo)getApplicationContext());
    String state = appState.getGlobalState();
    ...
    }
}
 0
Author: Vaishali Sutariya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 05:35:08

Można utworzyć klasę, która rozszerza klasę Application, a następnie zadeklarować zmienną jako pole tej klasy i dostarczyć do niej metodę getter.

public class MyApplication extends Application {
    private String str = "My String";

    synchronized public String getMyString {
        return str;
    }
}

A następnie, aby uzyskać dostęp do tej zmiennej w swojej aktywności, użyj tego:

MyApplication application = (MyApplication) getApplication();
String myVar = application.getMyString();
 0
Author: Amit Tiwari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-28 13:05:10