Android'de küresel değişkenler nasıl bildirilir?


595

Giriş gerektiren bir uygulama oluşturuyorum. Ana ve giriş etkinliğini oluşturdum.

Ana aktivite onCreateyönteminde aşağıdaki koşulu ekledim:

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

    ...

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

onActivityResultGiriş formu gibi görünür sonlandırıldığında yürütüldüğünde yöntemi:

@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);
            }
        }
    }

Sorun giriş formu bazen iki kez ( login()yöntem iki kez denir) görünür ve aynı zamanda telefon klavye slaytlar giriş formu tekrar görünür ve sorun değişken olduğunu sanırım strSessionString.

Kullanıcı, kimlik doğrulaması başarıyla tamamlandıktan sonra giriş formunun görünmesini önlemek için değişkeni global olarak ayarlamayı bilen var mı?


kaydedilmiş örnek durum paketini kullanarak bir etkinlik durumunun nasıl ele alınacağına dair iyi bir öğretici quicktips.in/…
Deepak Swami

Yanıtlar:


954

Bu cevabı '09'da Android nispeten yeniyken yazdım ve Android geliştirmede pek sağlam olmayan alanlar vardı. Bu yazının altına uzun bir zeyilname ekledim, bazı eleştirileri ele aldım ve alt sınıflandırma uygulaması yerine Singletons kullanımıyla ilgili felsefi bir anlaşmazlığı detaylandırdım. Kendi sorumluluğunuzdadır okuyun.

ORİJİNAL CEVAP:

Karşılaştığınız daha genel sorun, çeşitli Faaliyetler ve uygulamanızın tüm bölümlerinde durumun nasıl kaydedileceğidir. Statik bir değişken (örneğin, bir singleton) bunu başarmanın yaygın bir Java yoludur. Bununla birlikte, Android'de daha zarif bir yolun, durumunuzu Uygulama bağlamıyla ilişkilendirmek olduğunu buldum.

Bildiğiniz gibi, her Etkinlik aynı zamanda en geniş anlamıyla yürütme ortamı hakkında bilgi olan bir Bağlamdır. Uygulamanızın bir bağlamı vardır ve Android, uygulamanızda tek bir örnek olarak var olacağını garanti eder.

Bunu yapmanın yolu, kendi android.app.Application alt sınıfınızı oluşturmak ve ardından bu sınıfı bildiriminizde uygulama etiketinde belirtmektir. Artık Android otomatik olarak bu sınıfın bir örneğini oluşturacak ve tüm uygulamanız için kullanılabilir hale getirecektir. Yöntemi contextkullanarak herhangi birinden erişebilirsiniz Context.getApplicationContext()( aynı etkiye sahip Activitybir yöntem de sağlar getApplication()). Takip edilecek uyarılar ile son derece basitleştirilmiş bir örnek aşağıdadır:

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();
    ...
  }
}

Bu, esasen statik bir değişken veya singleton kullanmakla aynı etkiye sahiptir, ancak mevcut Android çerçevesine oldukça iyi entegre olur. Bunun işlemler arasında çalışmayacağını unutmayın (uygulamanız birden çok işlemi olan nadir uygulamalardan biri olması durumunda).

Yukarıdaki örnekten not edilecek bir şey; bunun yerine şöyle bir şey yaptığımızı varsayalım:

class MyApp extends Application {

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

  public String getState(){
    return myState;
  }
}

Şimdi bu yavaş başlatma (disk vurmak, ağ vurmak, herhangi bir engelleme, vb gibi) Uygulama her başlatıldığında yapılacaktır! Bunun süreç için sadece bir kez olduğunu düşünebilirsiniz ve maliyeti yine de ödemek zorundayım, değil mi? Örneğin, Dianne Hackborn'un aşağıda belirttiği gibi, işleminizin bir arka plan yayın olayını işlemesi için -sadece- somutlaştırılması tamamen mümkündür. Yayın işleminizin bu duruma ihtiyacı yoksa, hiçbir şey için potansiyel olarak bir dizi karmaşık ve yavaş işlem gerçekleştirmişsinizdir. Tembel örnekleme burada oyunun adıdır. Aşağıdakiler, en basit kullanımlardan başka bir şey için daha mantıklı olan Uygulamayı kullanmanın biraz daha karmaşık bir yoludur:

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();
    ...
  }
}

Application subclassing'i burada daha zarif bir çözüm olarak singletons kullanmaya tercih etsem de, geliştiricilerin durumun Application subclass ile ilişkilendirilmesinin performansı ve çok iş parçacıklı etkileri aracılığıyla hiç düşünmemek yerine gerçekten singletonları tercih ediyorum.

Not 1: Ayrıca, anti-cafe yorum gibi, uygulama geçersiz kılma uygulamanıza doğru bağlamak için bildirim dosyasında bir etiket gereklidir. Daha fazla bilgi için yine Android belgelerine bakın. Bir örnek:

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

NOT 2: user608578, bunun yerel nesne yaşam döngülerini yönetmekle nasıl çalıştığını sorar. Android ile yerel kodu en ufak bir şekilde kullanma hızına sahip değilim ve bunun çözümümle nasıl etkileşime gireceğini cevaplamak için nitelikli değilim. Birisinin buna bir cevabı varsa, ben onları kredilendirmek ve maksimum görünürlük için bu yazıya bilgi koymak istiyorum.

EK:

Bazı insanların belirttiği gibi, bu kalıcı bir durum için bir çözüm değildir , belki de orijinal cevapta daha fazla vurgulamam gerekirdi. Yani bu, uygulama ömürleri boyunca kalıcı olması gereken kullanıcı veya diğer bilgileri kaydetmek için bir çözüm değildir. Bu nedenle, diske kalıcı olarak ihtiyaç duyulan herhangi bir şeyin bir Uygulama alt sınıfı aracılığıyla saklanmaması gerektiğinden, herhangi bir zamanda öldürülen Uygulamalara, vb. Geçici, kolayca yeniden oluşturulabilir uygulama durumunu (örneğin bir kullanıcının oturum açıp açmadığını) ve tek örnekli bileşenleri (örneğin uygulama ağ yöneticisi) ( NOT singleton!) Saklamak için bir çözümdür .

Dayerman, Reto Meier ve Dianne Hackborn ile Uygulama alt sınıflarının kullanımının Singleton kalıpları lehine cesaret kırıldığı ilginç bir sohbete işaret edecek kadar nazikti . Somatik, daha önce bu doğaya ait bir şeyi daha önce işaret etmişti, ancak o zaman görmedim. Reto ve Dianne'nin Android platformunu sürdürmedeki rolleri nedeniyle, tavsiyelerini görmezden gelmeyi tavsiye edemiyorum. Dedikleri şey gider. Singleton'u Uygulama alt sınıflarına tercih etme konusunda dile getirilen görüşlere katılmıyorum. Anlaşmamda, Singleton tasarım modelinin StackExchange açıklamasında en iyi açıklanan kavramlardan yararlanacağım, böylece bu cevaptaki terimleri tanımlamak zorunda değilim. Devam etmeden önce bağlantıyı gözden geçirmenizi şiddetle tavsiye ediyorum. Noktadan noktaya:

Dianne, "Uygulamadan alt sınıflamak için hiçbir neden yoktur. Tek birton yapmaktan farklı değildir ..." Bu ilk iddia yanlıştır. Bunun iki ana nedeni var. 1) Uygulama sınıfı, bir uygulama geliştiricisi için daha iyi bir ömür boyu garanti sağlar; uygulamanın kullanım ömrü garantilidir. Bir singleton, etkili bir şekilde olmasına rağmen, uygulamanın kullanım ömrüne özel olarak bağlı değildir. Bu, ortalama uygulama geliştiriciniz için bir sorun olmayabilir, ancak bunun tam olarak Android API'nin sunması gereken sözleşme türü olduğunu ve ilgili kullanım ömrünü en aza indirerek Android sistemine daha fazla esneklik sağladığını iddia ediyorum. veri. 2) Application sınıfı, uygulama geliştiricisine durum için tek bir örnek tutucu sağlar, ki bu Singleton devlet sahibinden çok farklı. Farklılıkların listesi için yukarıdaki Singleton açıklama bağlantısına bakın.

Dianne, "... Uygulama nesnenizin bağımsız uygulama mantığı ne olması gerektiğine dair bu büyük karışıklık haline geldiğini gördüğünüzde gelecekte pişman olacağınız bir şey olacak." Bu kesinlikle yanlış değildir, ancak bu uygulama üzerinden Singleton'u seçmenin bir nedeni değildir. Diane'in argümanlarından hiçbiri, Singleton kullanmanın bir Uygulama alt sınıfından daha iyi bir neden sunmadığını, kurmaya çalıştığı tek şey, Singleton kullanmanın yanlış olduğuna inandığım bir Uygulama alt sınıfından daha kötü olmadığıdır.

"Ve bu, doğal olarak bu şeyleri nasıl yönetmeniz gerektiğine - talep üzerine onları başlatmaya" yol açar. Bu, bir Uygulama alt sınıfını kullanarak da istek üzerine başlatamamanız için hiçbir neden olmadığı gerçeğini göz ardı eder. Yine hiçbir fark yok.

Dianne ile biten "Çerçevenin kendisi yüklü kaynakların önbellekleri, nesne havuzları, vb gibi uygulama için tuttuğu tüm küçük paylaşılan veriler için ton ve ton tek ton vardır. Harika çalışıyor." Singletons kullanmanın iyi çalışamayacağını veya meşru bir alternatif olmadığını iddia etmiyorum. Singletons'un Android sistemiyle bir Uygulama alt sınıfı kullanmak kadar güçlü bir sözleşme sağlamadığını ve ayrıca Singletons kullanmanın genellikle kolayca değiştirilemeyen ve yolda birçok soruna yol açan esnek olmayan bir tasarıma işaret ettiğini iddia ediyorum. Android API'nın geliştirici uygulamalarına sunduğu güçlü sözleşme IMHO, Android ile programlamanın en çekici ve hoş yönlerinden biridir ve Android platformunu bugünkü başarıya taşıyan erken geliştiricinin benimsenmesine yardımcı oldu.

Dianne, Uygulama alt sınıflarını kullanmanın ek bir dezavantajından da bahseterek aşağıda yorum yaptı, daha az performans kodu yazmayı teşvik edebilir veya kolaylaştırabilir. Bu çok doğrudur ve burada mükemmelliği düşünmenin ve Uygulama alt sınıfını kullanıyorsanız doğru yaklaşımı almanın önemini vurgulamak için bu cevabı düzenledim. Dianne'nin belirttiği gibi, işlem yalnızca bir arka plan yayını için yükleniyor olsa bile, işleminiz her yüklendiğinde (uygulamanız birden çok işlemde çalışıyorsa bir kerede birden çok kez olabilir!) Uygulama sınıfınızın somutlaştırılacağını hatırlamanız önemlidir. Etkinlik. Bu nedenle, Uygulama sınıfını, herhangi bir işleme tabi tutulması yerine uygulamanızın paylaşılan bileşenlerine işaretçiler için bir havuz olarak kullanmak daha önemlidir!

Daha önceki StackExchange bağlantısından çalındığı gibi, sizi Singletons için aşağıdaki dezavantajlar listesine bırakıyorum:

  • Soyut veya arayüz sınıflarını kullanamama;
  • Alt sınıfta yetersizlik;
  • Uygulama boyunca yüksek kuplaj (değiştirilmesi zor);
  • Test edilmesi zor (birim testlerinde sahte / alay edilemez);
  • Değişebilir durumda paralelleme zor (kapsamlı kilitleme gerektirir);

ve kendiminkini ekle:

  • Android (veya diğer birçok) geliştirme için uygun olmayan belirsiz ve yönetilemez ömür boyu sözleşme;

93
Teşekkür ederim Yakında - Bu tür cevaplar Stack Overflow'u bu kadar çok sevmem nedenidir. İYİ İŞ!
JohnnyLambada

5
"Manifestinizde uygulama etiketinde bu sınıfı nasıl belirleyeceğinizi" merak eden herkes için, bu yazıdan itibaren, bu sorunun nasıl yapılacağını (android: name kullanın), biri ebuprofen ve diğeriyle açıklayan iki cevap daha vardır. Mike Brown.
Tyler Collier

9
Yakında, cevabınız doğru, ancak Android Manifest dosyasına <application android: name = ". MyApp" ... /> eklememiz gerektiğini fark edebildiniz mi?
anticafe

12
Bir kez daha tekrarlayayım, Uygulama için globaller kullanmamalısınız. Hiçbir faydası yoktur, tek tonlara göre herhangi bir fayda sağlamaz ve sürecinizi başlatma performansına zarar vermek gibi aktif olarak zararlı olabilir. Uygulama oluşturulurken, sürecinizin ne için oluşturulduğu hakkında hiçbir fikriniz yoktur. Singletonları gerektiği gibi tembel olarak başlatarak, yalnızca gerekli işleri yapmanız gerekir. Örneğin, bir arka plan olayıyla ilgili bir yayını işlemek için süreciniz başlatılırsa, kullanıcı arayüzünüz için gereken küresel durumu başlatmak için herhangi bir neden yoktur.
hackbod

14
Ayrıca, burada gerçekten açık olalım - tek tektonlara karşı tüm argümanlarınız tamamen geçerlidir, aslında tek birton ile küresel olmayan başka bir yaklaşım arasında seçim yaptığınız durumlar hakkında konuşurken; singletonlar küreseldir, küreseller hakkındaki tüm uyarılar geçerlidir. Ancak, Uygulama aynı zamanda bir singleton . Alt sınıflandırma uygulamasına geçerek bu problemlerden kaçmıyorsunuz, bir uygulama tamamen tek bir (ama daha kötü) ile aynı, daha temiz bir şey yaptığınızı kandırmanıza izin veriyor. Ama sen değilsin.
hackbod

153

Bu alt sınıfı oluştur

public class MyApp extends Application {
  String foo;
}

AndroidManifest.xml'de android ekle: ad

Misal

<application android:name=".MyApp" 
       android:icon="@drawable/icon" 
       android:label="@string/app_name">

1
bunun için teşekkürler. Manifest'te nasıl ilan edileceğini merak ediyordum
Birisi

3
Benim için çalışması için "." içinde ".MyApp"
Birisi

3
sadece ana aktiviteden sonra ilan edin , aksi takdirde kurulum / dağıtım yapmayabilir
sami

11
sadece söylemek istiyorum, bu zaten orada olan ANA uygulama etiketinde gider ... bu ikinci bir tane değil :) zor yolu öğrenmek zorunda kaldı.
bwoogie

java.lang.IllegalAccessException: access to class is not allowed
Raptor

142

Soonil'in uygulama için bir durumu korumanın önerdiği yol iyidir, ancak zayıf bir noktası vardır - işletim sisteminin tüm uygulama sürecini öldürdüğü durumlar vardır. İşte bununla ilgili belgeler - Süreçler ve yaşam döngüleri .

Bir vaka düşünün - birileri sizi çağırdığı için uygulamanız arka plana giriyor (Telefon uygulaması şu anda ön planda). Bu durumda && diğer bazı koşullar altında (ne olabileceğini görmek için yukarıdaki bağlantıya bakın), işletim sistemi Applicationalt sınıf örneği de dahil olmak üzere uygulama işleminizi öldürebilir . Sonuç olarak devlet kaybolur. Daha sonra uygulamaya geri döndüğünüzde, işletim sistemi etkinlik yığınını ve Applicationalt sınıf örneğini geri yükleyecektir , ancak myStatealan olacaktır null.

AFAIK, devlet güvenliğini garanti etmenin tek yolu, örneğin uygulama dosyası SharedPreferncesiçin bir özel kullanmak veya (dahili dosya sistemindeki uygulama dosyası için bir özel kullanmak) durumun devam etmesini sağlamaktır .


10
+ İle devam etmek için +1 SharedPreferences; işte böyle yapıldığını gördüm. Kurtarılmış devlet için tercih sistemini kötüye kullanmak garip buluyorum, ancak o kadar iyi çalışıyor ki, konu sadece bir terminoloji sorunu haline geliyor.
Cheezmeister

1
ShahimPreferences'ın Arhimed'in tanımladığı sorunu çözmek için nasıl kullanıldığına dair kodu yayınlayabilir misiniz (ya da bir açıklamaya bağlantı sağlayabilir misiniz)
Birisi

2
Tercihler, veritabanı, dosya serileştirme, vb. Her etkinlik onSaveInstanceState öğesini kullanıyorsa durumu koruyabilir, ancak kullanıcı etkinliğin dışında kaldığında ve geçmişi geçmiş yığınından kaldırırsa, zorla kapatır veya aygıtlarını kapatırsa yardımcı olmaz. .
Darren Hinderer

1
Bu davranış çok can sıkıcı bir durumdur - uygulamanızın onTerminate () yönteminin çağrılması çok kötü olmaz, böylece durumla zarif bir şekilde başa çıkabilirsiniz.
Dean Wild

2
Bence bu doğru cevap. Etkinlikler arasında var olan aynı uygulama örneğine güvenmek bir hatadır. Deneyimlerime göre, Android'in arka plandayken tüm sürecinizi tamamen yıkması ve yeniden oluşturması oldukça yaygındır. Arka plana sahip olmak, yalnızca bir kamera amacı, tarayıcı amacı veya telefon görüşmesi almak anlamına gelebilir.
Jared Kells

26

Sadece bir not ..

Ekle:

android:name=".Globals"

veya alt sınıfınızı mevcut <application> etikete ne adlandırmış olursanız olun . <application>Manifest'e başka bir etiket eklemeye devam ettim ve bir istisna alırdım.


Merhaba Gimbl. Ben de aynı problemi yaşadım. Ayrıca kendi <application> etiketim vardı ve başka bir <application> etiketi eklemeye çalıştığımda sizinle aynı sorun yaşadım (istisna mesajı). Ama bahsettiğiniz şeyi yaptım ve işe yaramadı. <application> etiketine android: name = ". GlobalClass" ekliyorum ama çalışmıyor. Nasıl çözdüğünüzü tam olarak açıklayabilir misiniz?
Sonhja

3
İyi <manifest> <uygulama android: name = ". GlobalData"> </application> </manifest>. Kötü <manifest><application> </application> <uygulama android: ad = ". GlobalData"> </application> </manifest>
Gimbl

13

Uygulama etiketini nasıl belirleyeceğimi de bulamadım, ancak Googling'in birçoğundan sonra, manifest dosya belgelerinden belirgin hale geldi: uygulama stanzundaki varsayılan simgeye ve etikete ek olarak android: name kullanın.

android: name Uygulama için uygulanan bir Uygulama alt sınıfının tam adı. Başvuru süreci başlatıldığında, bu sınıf uygulamanın herhangi bir bileşeninden önce başlatılır.

Alt sınıf isteğe bağlıdır; çoğu uygulama bir taneye ihtiyaç duymaz. Bir alt sınıfın yokluğunda, Android temel Uygulama sınıfının bir örneğini kullanır.


13

Bu küresel yapılarla yerel belleğin toplanmasını sağlamaya ne dersiniz?

Etkinliklerin onPause/onDestroy()imha üzerine çağrılan bir yöntemi vardır, ancak Application sınıfının eşdeğeri yoktur. Global yapılar (özellikle yerel belleğe referanslar içerenler), uygulama öldürüldüğünde veya görev yığını arka plana konduğunda uygun şekilde toplanmasını sağlamak için hangi mekanizma önerilir?


1
Açık çözüm, yerel kaynaklardan sorumlu nesneleriniz için Closeable arayüzünü uygulamak ve bunların bir kaynaklarla dene ifadesi veya başka bir şeyle yönetilmelerini sağlamaktır. En kötü durumda, her zaman bir nesne sonlandırıcı kullanabilirsiniz.
sooniln

5

Sadece aşağıdaki gibi çalışacak bir uygulama adı tanımlamanız gerekir:

<application
  android:name="ApplicationName" android:icon="@drawable/icon">
</application>

4

Yukarıda tartışıldığı gibi OS, herhangi bir bildirim yapmadan UYGULAMAYI öldürebilir (onDestroy olayı yoktur), bu nedenle bu global değişkenleri kaydetmenin bir yolu yoktur.

SharedPreferences, COMPLEX STRUCTURED değişkeniniz dışında bir çözüm olabilir (benim durumumda, kullanıcının zaten işlediği kimlikleri saklamak için tamsayı dizim vardı). SharedPreferences ile ilgili sorun, bu değerlerin her seferinde depolanmasının ve geri getirilmesinin zor olmasıdır.

Benim durumumda arka plan HİZMET vardı, bu yüzden bu değişkenleri oraya taşıyabilir ve hizmet onDestroy olayı olduğundan, bu değerleri kolayca kaydedebilirim.


onDestroy () öğesinin bir hizmet için bile çağrılacağı garanti edilmez.
OpenGL ES

Evet, bu gerçekleşebilir, ancak sadece kritik durumlarda.
Adorjan Princz

4

Bazı değişkenler sqlite içinde saklanıyorsa ve bunları uygulamanızdaki çoğu aktivitede kullanmanız gerekiyorsa. o zaman Uygulama belki bunu başarmak için en iyi yol. Uygulama başlatıldığında değişkenleri veritabanından sorgulayın ve bir alanda saklayın. Ardından bu değişkenleri etkinliklerinizde kullanabilirsiniz.

Öyleyse doğru yolu bul ve en iyi yol yok.


3

Bu tür bir durumu depolamak için statik bir alanınız olabilir. Veya kaynağı Bundle'a koyun ve onCreate (Bundle savedInstanceState) üzerinde oradan geri yükleyin. Sadece Android uygulaması tarafından yönetilen yaşam döngüsünü tamamen anladığınızdan emin olun (örneğin, klavye yönlendirme değişikliğinde neden login () çağırılır).


2

DO DEĞİL kullanın başka <application>file.Just mevcut bir değişiklik yapmak Manifestte etiketi <application>etiketi, bu satırı ekleyin android:name=".ApplicationName", nerede ApplicationNamesenin alt sınıf ki (küresel saklamak için kullanımı) adı olacaktır, oluşturmak üzere.

bu nedenle, sonunda manifest dosyasındaki ONE AND ONLY <application> etiketiniz aşağıdaki gibi görünmelidir:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.AppCompat.NoActionBar"
        android:name=".ApplicationName"
        >

1

Intents, Sqlite veya Shared Preferences kullanabilirsiniz. Medya depolama alanı söz konusu olduğunda, belgeler, fotoğraflar ve videolar gibi, bunun yerine yeni dosyaları oluşturabilirsiniz.


1

Bunu iki yaklaşımı kullanarak yapabilirsiniz:

  1. Uygulama sınıfını kullanma
  2. Paylaşılan Tercihleri ​​Kullanma

  3. Uygulama sınıfını kullanma

Misal:

class SessionManager extends Application{

  String sessionKey;

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

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

MainActivity'ye giriş yapmak için yukarıdaki sınıfı aşağıdaki gibi kullanabilirsiniz. Kod şöyle görünecektir:

@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.
}

Bu yöntem geçici depolama için çalışacaktır. Düşük bellek nedeniyle işletim sisteminin uygulamayı öldüreceği konusunda hiçbir fikriniz yok. Uygulamanız arka planda olduğunda ve kullanıcı çalıştırmak için daha fazla bellek gerektiren başka bir uygulamada gezinirken, işletim sistemi arka plan işlemlerinden daha fazla ön plan işlemlerine daha fazla öncelik verdiği için uygulamanız öldürülür. Bu nedenle, kullanıcı oturumu kapatmadan önce uygulama nesneniz boş olacaktır. Bu nedenle yukarıda belirtilen ikinci yöntemi kullanmanızı tavsiye ederim.

  1. Paylaşılan tercihleri ​​kullanma.

    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");

0

Etkinlik sonucu, özgeçmişte daha önce çağrılır. Bu yüzden oturum açma kontrolünü devam ettirdiğinizde taşıyın ve secomd etkinliği olumlu bir sonuç döndürdüğünde ikinci girişiniz engellenebilir. Özgeçmişte her zaman çağrılır, bu yüzden ilk kez çağrılmamasından endişe yoktur.


0

Alt sınıflama yaklaşımı BARACUS çerçevesi tarafından da kullanılmıştır. Benim bakış açımdan alt sınıf Uygulama Android yaşam döngüleri ile çalışmak amaçlanmıştır; Bu ne olduğu herhangi Uygulama Konteyner yapar. O zaman küresellere sahip olmak yerine, bu bağlamda fasulyeleri kayıt ederek, bağlam tarafından yönetilebilen herhangi bir sınıfa enjekte edilmelerine izin veriyorum. Enjekte edilen her fasulye örneği aslında tek bir tondur.

Ayrıntılar için bu örneğe bakın

Çok daha fazlasına sahipseniz neden manuel olarak çalışıyorsunuz?


0
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

Sınıfı genişleten bir sınıf oluşturabilir Applicationve daha sonra değişkeninizi o sınıfın alanı olarak ilan edebilir ve bunun için getter yöntemi sağlayabilirsiniz.

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

    synchronized public String getMyString {
        return str;
    }
}

Ardından, Etkinliğinizdeki bu değişkene erişmek için şunu kullanın:

MyApplication application = (MyApplication) getApplication();
String myVar = application.getMyString();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.