Genişletilmiş Application
sınıf genel değişkenleri bildirebilir. Başka sebepler var mı?
Genişletilmiş Application
sınıf genel değişkenleri bildirebilir. Başka sebepler var mı?
Yanıtlar:
Ö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.
"prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"
. Küresel durumu her zaman elimizden
apk
Cep telefonumuzda bir dosyayı dikkate alırsak , Activity
s, Service
s ve diğerleri gibi birden çok yararlı bloktan oluşur .Application
bakılmaksızın bir değişkene ve durumlarına genel olarak erişmemiz gereken bir senaryo gerekebilir.Activity
Application
,Cursor
ve tekrar tekrar kapatmak performansta iyi değildir,Intent
Verileri iletmek için s'yi kullanabiliriz , ancak bellek kullanılabilirliğine bağlı olarak bu beceriksizdir ve etkinliğin kendisi belirli bir senaryoda olmayabilir.Application
,Application
Uygulama sınıfı Activity
s veya
Services
s çalıştırılmadan önce başlatıldığından, analitik vb. Gibi belirli şeyleri başlatmak için kullanabilirsiniz.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
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
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.
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);
}
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.
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. Application
Bö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.
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.
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.
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.
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
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