Application Sınıfı

Application Class

Merhabalar, bu yazımda Application sınıfı hakkında bahsedeceğim.

Application sınıfı, bir uygulamanın activity veya servisler gibi sınıfları içinde barındıran bir sınıftır. Uygulama çalıştırıldığında herhangi bir bileşen/nesne (activity, servis, nesneler, vs.) çalıştırılmadan önce ilk olarak application nesnesi veya bunu inherit eden nesneler çalıştırılır.

İlk olarak birkaç override metottan bahsedeyim.

onConfigurationChanged( ) Aygıt yönü değiştiğinde çalışır.
onCreate( ) Application çalıştığında çalışır.
onLowMemory( ) Hafızada az yer kaldığında hafızayı boşaltılacağında ilişkili Application nesnesinin hafızadan temizlenirken bu metot çalışır.
onTerminate( ) Emülatörde uygulamayı test ederken kullanılan metotlardan biridir, gerçek device üzerinde çalışmaz.

Bu sınıfı uygulamamızda kullandık diyelim. Uygulama crash ettiğinde NPE hatası vermemesi için Application nesnesi içerisinde shared mutable veriler değişken içerisinde saklanmaması gerekir. Bunun nedeni Application nesnesinin, hafızada yer açılması gerektiğinde LRU sıralamasına göre hafızadan silinme ihtimalinin yüksek olmasıdır. Böyle bir durum memory leak’e sebebiyet verir.

Mesela, Application nesnesi içerisinde String türündeki name değişkenine bir isim atadınız ve bunu herhangi bir Activity içerisinde kullandınız. Uygulama kullanıcı tarafından arka plana itildi, birkaç dakika sonra uygulamaya geri döndü, uygulama NPE error hatasıyla karşılaşır.

Bunun yerine persistance teknikleri kullanarak verilerinizi aygıta depolayabilirsiniz. Ya da yok ben illa application nesnesi içerisinde kullanacağım diyorsanız veriyi Intent yoluyla Activity nesnesine geçirmeniz iyi olacaktır. Null-check uygulayabilirsiniz. Bu konu için aşağıda yazdığım use-case’leri okumanız iyi olacaktır.

Use-cases

Application sınıfı kullanarak uygulama düzeyinde kullanılabilecek global değişkenler oluşturabilirsiniz. Bunun iki yolundan da bahsedeceğim. Konumuz Application sınıfı olduğu için ilk bundan bahsedeyim. Aşağıdaki örnekte, Application’ı inherit eden bir sınıf oluşturdum ve uygulamamda her yerde kullanmak istediğim bir değişkeni ve get/set metotlarını içerisinde tanımladım.

public class MyApplication extends Application {
	private int globalVariable=1;

	public int getGlobalVariable() {
			return globalVariable;
	}

	public void setGlobalVariable(int globalVariable) {
			this.globalVariable = globalVariable;
	}
	@Override
	public void onCreate() {
			//reinitialize variable
	}
}

Uygulamamda diyelimki bir activity içerisinde bunu kullanacağım. Aşağıdaki gibi MyApplication’dan global değişkeni çekip kullanabilirim.

((MyApplication)getApplication()).setGlobalVariable(10);
int valiable=((MyApplication )getApplication()).getGlobalVariable();

Manifest içerisinde application tag’i içerisinde application name’i tanımladım.

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

İkinci yol da Singleton kullanmak olacaktır, genellikle de singleton kullanmak yeterlidir Yeni bir class oluşturup içini doldurdum. Daha sonra projede herhangi bir yerden global değişkenleri çektim.

public class Globals{
	private static Globals instance;

	// Global variable
	private int data;

	// Restrict the constructor from being instantiated
	private Globals(){}

	public void setData(int d){
	 this.data=d;
	}
	public int getData(){
	 return this.data;
	}

	public static synchronized Globals getInstance(){
	 if(instance==null){
	   instance=new Globals();
	 }
	 return instance;
	}
}
// Inside an Activity or something
Globals g = Globals.getInstance();
g.setData(100);
...
int data=g.getData();

Diğer bir use-case ise uygulama çalışmaya başladığında arayüz gösterilmeden önce Application sınıfını kullanarak yapılması istenilen işler bu sınıf altında gerçekleştirilebilir. Uygulama başlarken internet bağlantısını kontrol etmek gibi.