Android Uygulama sınıfını neden genişletmelisiniz?


168

Genişletilmiş Applicationsınıf genel değişkenleri bildirebilir. Başka sebepler var mı?


Bu sadece kafamın üstünde bir fikir, ancak onCreate'ı geçersiz kılabilmeli ve MainActivity yerine bir seferlik bir başlangıç ​​ekranı gösterebilmelisiniz, yani kullanıcı uygulamayı ilk açtığında bir giriş ekranı gösterebilmelisiniz.
btse

Yanıtlar:


29

Öte yandan, Uygulamanın genişletilmesinin başka bir yaklaşıma tercih edilebilir veya bir şeyi başarmak için gerekli olduğu gerçek bir senaryo düşünemiyorum. Pahalı, sık kullanılan bir nesneniz varsa, nesnenin o anda bulunmadığını algıladığınızda IntentService içinde başlatabilirsiniz. IntentService kendi iş parçacığında çalışırken uygulamanın kendisi UI iş parçacığında çalışır.

Verileri Etkinlik'ten Etkin Amaçlarla Etkinliğe geçirmeyi veya SharedPreferences'ı kullanmayı tercih ederim. Arabirimleri kullanarak bir Parçadan ana Etkinliğine veri aktarmanın yolları da vardır.


39
Uygulama sınıfını genişletmenin birçok kullanımı vardır. Çok yararlı bir uygulamada yakalanmamış tüm istisnaları yakalamaktır. Yani bu çok kullanışlı bir şey
png

3
Bunu nasıl yaptın ?
serj

8
İçin +1 "prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences". Küresel durumu her zaman elimizden
geldiğince ortadan kaldırmalı

9
neden? bir noktada farklı süreçlerde veya herhangi bir uygulama tarafından yeniden kullanılabilir her türlü bileşen çalışan android için hazırlamak için kasıtlı olarak sınırlı iken? sadece veri nesnelerini serileştirmek yerine geçmek cpu ve bellek tasarrufu sağlar. aynı cihaz üzerinde işlem içi aktarıcılar için parseller hiçbir şekilde ideal değildir. Gerçekten böyle intentservice kullanım noktası görmüyorum (sadece yeni ile diğer iş parçacığı yapmak). kodlayıcıları şaşırtan şeylerin birçoğu, google'ın eklenen tüm "yardımcılarının" etkinliklerin ayrı bilgisayarlarda çalıştığı gibi yapıldığından geliyor.
Lassi Kinnunen

127

Giriş:

resim açıklamasını buraya girin

  1. apkCep telefonumuzda bir dosyayı dikkate alırsak , Activitys, Services ve diğerleri gibi birden çok yararlı bloktan oluşur .
  2. Bu bileşenler birbirleriyle düzenli olarak iletişim kurmazlar ve kendi yaşam döngülerine sahip olduklarını unutmayın. bu da bir seferde aktif olabileceğini ve diğer anda etkisiz olabileceğini gösterir.

Gereksinimler:

  1. Bazen , kullanıcının kullandığı herhangi bir şeye Applicationbakılmaksızın bir değişkene ve durumlarına genel olarak erişmemiz gereken bir senaryo gerekebilir.Activity
  2. Bir örnek, bir kullanıcının, personel bilgilerinin tutulduğu bir değişkene (örneğin ad) Application,
  3. SQLite kullanabiliriz ancak bir oluşturmak Cursorve tekrar tekrar kapatmak performansta iyi değildir,
  4. IntentVerileri iletmek için s'yi kullanabiliriz , ancak bellek kullanılabilirliğine bağlı olarak bu beceriksizdir ve etkinliğin kendisi belirli bir senaryoda olmayabilir.

Uygulama Sınıfının Kullanım Alanları:

  1. Değişkenlere erişim Application,
  2. ApplicationUygulama sınıfı Activitys veya Servicess çalıştırılmadan önce başlatıldığından, analitik vb. Gibi belirli şeyleri başlatmak için kullanabilirsiniz.
  3. OnConfigurationChanged () adı verilen ve uygulama yapılandırması değiştirildiğinde (yataydan dikey ve tersi) tetiklenen geçersiz kılınmış bir yöntem vardır,
  4. Android cihazının belleği azaldığında tetiklenen onLowMemory () adlı bir olay da vardır.

Gereksinim bölümünde neden SharedPreferences kullanılmıyor?

Kişisel bilgileri kaydetmek gibi 1. örnekte, SharedPreferences kullanılabilir. Ancak son bölümde verdiğiniz örnekler şüphelerimi ortadan kaldırdı. Teşekkürler!
Saurabh Singh

63

Uygulama sınıfı, uygulamanızın tüm yaşam döngüsüne sahip olan nesnedir. Uygulama olarak en yüksek katmanınızdır. olası kullanımlara örnek:

  • Uygulama sınıfında onCreate değerini geçersiz kılarak uygulama başlatıldığında ihtiyacınız olanı ekleyebilirsiniz.

  • Etkinlikten Etkinliğe atlayan genel değişkenleri depolar. Asynctask gibi.

    vb


4
Uygulamayı global uygulama değişkenleri için boşaltma alanı olarak kullanmak büyük kod kokusudur. Bunu yapmak için kendi özel, daha spesifik sınıflarınızı tek tek veya statik değişkenlerle kullanmalısınız.
Austin

5
@ Austin neden bir koku?
Relm

1
Evet, neden kokuyorsun? Daha önce de belirtildiği gibi, Uygulama sınıfı hiyerarşinin en üstündedir ve öğle yemeği parama bahse girebilirim, bunun altında özel bir singleton sınıfı vardır. Yani, itme kıpırdamaya geliyorsa ve telefonunuzun hafızası azalırsa, özel singletonun Uygulama sınıfı yerine öldürülen ilk kişi olduğunu söyleyebilirim (esasen tüm uygulamanızdır).
Starwave

31

Bazen birden fazla Etkinlikten erişilmesi gereken global değişkenler gibi verileri saklamak istersiniz - bazen uygulamanın her yerinde. Bu durumda, Application nesnesi size yardımcı olacaktır.

Örneğin, her http isteği için temel kimlik doğrulama verilerini almak istiyorsanız , uygulama nesnesindeki kimlik doğrulama verileri için yöntemleri uygulayabilirsiniz.

Bundan sonra, kullanıcı adı ve şifreyi aşağıdaki gibi etkinliklerden herhangi birinde alabilirsiniz:

MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();

Son olarak, Application nesnesini tekli bir nesne olarak kullanmayı unutmayın:

 public class MyApplication extends Application {
    private static MyApplication singleton;

    public MyApplication getInstance(){
        return singleton;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
    }
}

Daha fazla bilgi için lütfen Uygulama Sınıfı'na tıklayın


2
lütfen bana bunu açıklayın, neden kendisi bir singleton olduğunu bildiğim kadar açık bir şekilde bir Application sınıfının singleton nesnesini yapmamız gerekiyor. Birden fazla uygulama nesnesi yapabilir miyiz, eğer yapabilirsek, nasıl? ve sonuçları nedir? Lütfen açıklayınız.
Syed Raza Mehdi

Hayır, muhtemelen sadece bir uygulama sınıfı. developer.android.com/guide/topics/manifest/…
IntelliJ Amiya

o zaman neden bunun tekil nesnesini açık tutmamız gerekiyor? İşletim sistemi bunu bizim için sürdürmüyor mu? Aslında aktivite sınıfında yapılan bir uygulama nesnesi var ve bu manifest içinde bahsedilmeyen bir kodla karşılaştı. Bunun yanlış olduğunu düşünüyorum, neden statik singleton nesnesi yaptığımızı merak ediyorum. Düşündüğünüz en iyi yaklaşım. Cevabınız için teşekkürler.
Syed Raza Mehdi

1
teşekkürler Cevabımı bu bağlantıda buldum geliştirici.android.com
reference/android/

* Singleton * nesnesi nerede
Dr. aNdRO

8

Application sınıfı, herhangi bir etkinlikten veya bir Context nesnesine sahip olduğunuz herhangi bir yerden erişebileceğiniz tek bir düğmedir.

Ayrıca biraz yaşam döngüsü elde edersiniz.

Analitik yardımcısı gibi pahalı ancak sık kullanılan nesneleri başlatmak için Uygulamanın onCreate yöntemini kullanabilirsiniz. Ardından bu nesnelere her yerde erişebilir ve kullanabilirsiniz.


6
"Biraz yaşam döngüsü de elde edersiniz." tekrar gözden geçirmek isteyebilirsiniz.
wtsang02

2
Demek istediğim, bazı yaşam döngüsü çağrıları alıyorsunuz, ancak bir etkinlik ya da parçayla olduğu kadar değil. Örneğin, Application sınıfı için onDestroy () yoktur.
Jon F Hancock

Bu sınıf otomatik olarak oluşturulmuş mu?
Konstantin Konopko

Evet. Sürece doğru AndroidManifest.xml içinde belirttiğiniz sürece.
Jon F Hancock

Hayır, otomatik olarak oluşturulmaz.
Oluşturmanız

7

Uygulama sınıfının en iyi kullanımı. Örnek: Önyükleme tamamlandığında alarm yöneticinizi yeniden başlatmanız gerektiğini varsayalım.

public class BaseJuiceApplication extends Application implements BootListener {

    public static BaseJuiceApplication instance = null;

    public static Context getInstance() {
        if (null == instance) {
            instance = new BaseJuiceApplication();
        }
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();


    }

    @Override
    public void onBootCompleted(Context context, Intent intent) {
        new PushService().scheduleService(getInstance());
        //startToNotify(context);
    }

Neden getApplication () kullanarak alabilir ve uygulama sınıfına yazabilirsiniz nerede uygulama nesnesinin statik bir başvuru yapmak gerektiğini merak ediyorum. Uygulama sınıfının işletim sisteminin kendisi tarafından yapıldığı ve işletim sistemi tarafından korunan tek bir örneği olması gerektiği anlaşıldığı kadarıyla. Lütfen açıklayınız, teşekkürler.
Syed Raza Mehdi

Haklısın. Uygulamanızdaki herhangi bir uygulama bileşeninden getApplication çağrıldığında, uygulamanız olan Uygulamadan türetilen tek örnek döndürülür. Bu, Android çerçevesi tarafından dahili olarak ele alınır. Tek yapmanız gereken, döndürülen örneği Uygulamayı genişleten özel sınıfınıza yönlendirmektir. Ayrıca, manifestinizi buna göre ayarlamanız gerekir, böylece uygun sınıf, örneği örneklemek için Android çerçevesi tarafından kullanılır.
Matt Welke

5

Yanıt değil gözlem : genişletilmiş uygulama nesnesindeki verilerin aynı anda çalışan bir etkinliğin iki örneğine sahip olmanız mümkün olduğundan , bir etkinliğin örneğine bağlı olmaması gerektiğini unutmayın . ön plan ve biri görünmüyor) .

Örneğin, etkinliğinizi normalde başlatıcı üzerinden başlatır ve ardından "simge durumuna küçültür". Ardından, örneğin kısayol oluşturmak için etkinliğinizin başka bir örneğini başlatan başka bir uygulamayı (yani Tasker) başlatıyorsunuz, çünkü uygulamanız android.intent.action.CREATE_SHORTCUT'u destekliyor. Daha sonra kısayol oluşturulur ve etkinliğin bu kısayol oluşturma çağrısı uygulama nesnesini değiştirirse, arka planda çalışan etkinlik, değiştirilen uygulama nesnesini ön plana getirildikten sonra kullanmaya başlayacaktır.


4

Bu sorunun bir cevabı eksik olduğunu görüyorum. Uzatıyorum Applicationçünkü Bill Pugh Singleton uygulamasını kullanıyorum ( referansa bakın ) ve bazı singletonlarımın içeriğe ihtiyacı var. ApplicationBöyle sınıf görünüyor:

public class MyApplication extends Application {

    private static final String TAG = MyApplication.class.getSimpleName();

    private static MyApplication sInstance;

    @Contract(pure = true)
    @Nullable
    public static Context getAppContext() {
        return sInstance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate() called");
        sInstance = this;
    }
}

Ve singletonlar şöyle görünür:

public class DataManager {

    private static final String TAG = DataManager.class.getSimpleName();

    @Contract(pure = true)
    public static DataManager getInstance() {
        return InstanceHolder.INSTANCE;
    }

    private DataManager() {
        doStuffRequiringContext(MyApplication.getAppContext());
    }

    private static final class InstanceHolder {
        @SuppressLint("StaticFieldLeak")
        private static final DataManager INSTANCE = new DataManager();
    }
}

Bu şekilde bir singleton kullanıyorum ve en az kod miktarı ile tembel senkronize başlatma almak her zaman bir bağlam olması gerekmez.

İpucu: Android Studio singleton şablonunu güncellemek çok zaman kazandırır.


3

Uygulama sınıfını birçok şey için kullanabileceğinizi düşünüyorum, ancak tüm Etkinlikleriniz veya Hizmetleriniz başlamadan ÖNCE bazı şeyler yapma gereksiniminize bağlılar. Örneğin, uygulamamda özel yazı tipleri kullanıyorum. Aramak yerine

Typeface.createFromAsset()

Varlıklar klasöründen yazı tiplerim için referans almak için her Etkinlikten (bu kötüdür çünkü bu yöntemi her çağırdığınızda varlıklara bir başvuru tutarken bellek sızıntısına neden olur), bunu onCreate()Uygulama sınıfımdaki yöntemden yaparım :

private App appInstance;
Typeface quickSandRegular;
...
public void onCreate() {
    super.onCreate();

    appInstance = this;
    quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(),
                       "fonts/Quicksand-Regular.otf");
   ...
   }

Şimdi, ben de böyle tanımlanmış bir yöntem var:

public static App getAppInstance() {
    return appInstance;
}

ve bu:

public Typeface getQuickSandRegular() {
    return quicksandRegular;
}

Uygulamamın herhangi bir yerinden, tek yapmam gereken:

App.getAppInstance().getQuickSandRegular()

Benim için Application sınıfının bir başka kullanımı da, bağlantı gerektiren etkinlik ve hizmetlerden ÖNCE cihazın İnternet'e bağlı olup olmadığını kontrol etmektir ve gerçekten gerekli önlemleri alır.


1
İyi dedi. Çok güzel yıkmak.
Oluwatobi Adenekan

3

Kaynak: https://github.com/codepath/android_guides/wiki/Uyarsız-the-Android-Application-Class

Birçok uygulamada, doğrudan bir uygulama sınıfıyla çalışmaya gerek yoktur. Ancak, özel uygulama sınıfının birkaç kabul edilebilir kullanımı vardır:

  • İlk etkinliğinizi oluşturmadan önce çalışması gereken özel görevler
  • Tüm bileşenler arasında paylaşılması gereken küresel başlatma (kilitlenme raporlaması, kalıcılık)
  • Paylaşılan ağ istemcisi nesnesi gibi statik değişmez verilere kolay erişim için statik yöntemler

Değişken örnek verilerini hiçbir zaman Application nesnesinin içinde saklamamalısınız çünkü verilerinizin orada kalacağını varsayarsanız, uygulamanız kaçınılmaz olarak bir noktada NullPointerException ile kilitlenir. Uygulama nesnesinin sonsuza kadar bellekte kalması garanti edilmez, öldürülür. Popüler inanışın aksine, uygulama sıfırdan yeniden başlatılmayacak. Android yeni bir Uygulama nesnesi oluşturacak ve uygulamanın daha önce hiç öldürülmediği yanılsamasını vermek için kullanıcının daha önce bulunduğu etkinliğe başlayacaktır.


1

Uygulama tarafından genişletildiyse, nesne oluşturmadan herhangi bir sınıfa değişkenlere erişebilirsiniz. Küresel olarak çağrılabilirler ve başvuru öldürülünceye kadar durumları korunur.


1

Uygulama genişletme kullanımı sadece uygulama çalışma süresi boyunca istediğiniz herhangi bir işlem için uygulama emin olun. Şimdi herhangi bir değişken olabilir ve sunucudan bazı verileri almak istiyorsanız varsayalım ki zaman uyumsuzluğunuzu uygulamaya koyabilirsiniz, böylece her seferinde ve sürekli olarak getirilecek, böylece otomatik olarak güncellenmiş bir veri alacaksınız .. Bu bağlantıyı kullanın daha fazla bilgi için ....

http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android


bu bir iş parçacığı değildir, bu nedenle "uygulama çalışma süreniz boyunca istediğiniz herhangi bir işlem için". doğru değil.
Lassi Kinnunen

1

Uzun süre çalışan iş parçacıkları veya bir etkinlik kullanmadığınız uygulama (örneğin, bir etkinlik değildir) uygulamanıza bağlanması gereken diğer nesneler için, uygulama kapsamında değişkenleri saklamak isteyebileceğiniz diğer yanıtları eklemek için .. bağlanmış bir hizmet talep edememe gibi .. daha sonra uygulama örneğine bağlanma tercih edilir. Bu yaklaşımla ilgili tek açık uyarı, nesneler uygulama canlı olduğu sürece yaşadığı için, bellek üzerinde daha örtülü kontrol gereklidir, aksi takdirde sızıntılar gibi bellekle ilgili sorunlarla karşılaşırsınız.

Yararlı bulabileceğiniz başka bir şey, işlem sırasına göre, uygulamanın herhangi bir etkinlikten önce başlamasıdır. Bu zaman diliminde, isterseniz ilk etkinliğinizden önce gerçekleşecek gerekli kat hizmetlerini hazırlayabilirsiniz.

2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created
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.