Etiket arşivi: programlama

Android Context Nedir ?

Merhaba,

Bugün Android’e uygulama yazarken sıkça kullandığımız bir sınıf olan Context’ten (android.content.Context)  bahsedeceğim. Activity başlatmak, broadcast atmak, view güncellemek, shared prefe erişmek için her zaman context’e ihtiyaç duyarız. Peki nedir bu context? Her context aynı mıdır? Şimdi bu soruların cevabını arayalım.

 

Nedir Bu Her Yerde Kullandığımız Context ?

Kabaca context,

Android sistemi tarafından soyut bir şekilde bize sunulan, uygulamamız hakkında global bilgiye sahip arayüzdür. Bir nevi uygulamamızın komponentlerinin kimliğidir diyebiliriz. Uygulama sistem veya yerel bazda kaynaklara erişmek istediğinde bu kimliği kullanır işletim sistemi de bu kimliğin yeterliliğine göre işlemi başlatır.

Context sayesinde işletim sisteminin bize sunduğu  uygulama özelindeki servislere erişebilir (Wifi Service, Activity Service, Location Service gibi) yine aynı şekilde uygulama seviyesinde operasyonları (activity başlatma, intent gönderme/alma gibi. ) gerçekleştirebiliriz.

Context’e birden fazla şekilde erişebiliriz. Şimdi bu erişim yollarını ve birbirinden farklarını inceleyelim.

Context Tipleri

Application Context (getApplicationContext()) – Uygulama prosesinde çalışan single instance’tır. Uygulamanız yaşadığı sürece yaşamına devam .eder. Farklı yerlerden erişim sağlasanız da aynı instance’ı elde edersiniz. Activity veya Service üzerinden getApplication() apisini çağırarak veya Context’i miras alan herhangi bir sınıftan getApplicationContext() apisini çağırarak erişebilirsiniz.

Activity/Service – ContextWrapper’dan türer ve her activity/service context kendine özgüdür. Activity yaşam döngüsüne bağlıdır. Activity’nin kendisi this contexti içerir. Bunun dışında MyActivity.this şeklinde de context’e ulaşabilirsiniz.

BroadcastReceiver – Kendisi context’e sahip değildir, broadcast için android yeni bir context oluşturmaz ancak onReceive() metodu içerisinden context sistem tarafından sağlanır. Buradaki context ReceiverRestrictedContext  instance’ıdır ve iki temel fonksiyonu kapalıdır. Bunlar:

  • Herhangi bir broadcast receiver içerisinden başka bir receiver’a kayıt (registerReceiver()) olamazsınız.
  • Bir service’e bind (bindService()) olamazsınız.

Broadcast receiver içerisinde onReceive() tetiklenmesi sonucunda gelen her context’in instance’ı birbirinden farklıdır.

ContentProvider – İçerisinde context barındırmaz. Ancak oluşturulduğunda bir context atanır. Atanan context uygulama contextidir. Eğer context provider uygulama içi veya aynı proses içerisinde çalışıyorsa sağlanan contextler aynı olur. Eğer ayrı prosesler ise temsil edilen her packet için ayrı context olur.

Herkesin Context’i Kendine

Farklı context türlerinden bahsettik.Şimdi bu context’lerin neleri yapıp yapamayacağından bahsedelim. Aşağıdaki tabloda hangi türdeki contextlerin neleri yapabileceğini görebiliriz.

getApplicationContext()’i Nerelerde Kullanmalıyız?

getApplicationContext() daha önce bahsettiğimiz gibi uygulamaya özel single instance bir context döndürür. Application komponenti, uygulamamızın global durumunu tutar.

Application context kullanmadan önce kendimize şu soruları sormalıyız?

  • Contexti uzun süre kullanan başka bir sınıfımız var mı? Eğer böyle bir sınıfımız varsa Activity context’i vermek memory leak’e sebep olabilir. Eğer işleminiz uzun süreli ve context’e ihtiyacınız varsa Application Context’i kullanmalıyız.
  • Uygulamanın görseli ile ilgili bir değişiklik yapıyor muyum?Arayüzde yaptığımız değişikliklere ait tema bilgileri Application Context’te bulunmaz. Bu da sorunlara yol açabilir. Uygulamanızın farklı activitylerinde farklı temalar kullanabilirsiniz. Özet olarak arayüz ile ilgili işlem yapıyorsak, o arayüze bağlı activity’nin contextini kullanmalıyız.

Activity Context’ini Nerelerde Kullanmalıyız ?

Activity’den oluşturulan context , activity yaşam döngüsü boyunca yaşar. Bundan dolayı activity contextini sadece o activity ile ilgili gerekli işlemlerde kullanmalıyız.

Context ile ASLA Yapmamamız Gereken Şeyler

Android her komponente uygun olacak context’i belirlemiştir. Context’i komponentler arası parametre olarak geçirmemeliyiz. Broadcast receiver ile gelen context’i activity’de, activity context’ini servis içinde kullanmamalıyız.

Memory leak oluşmaması için asla static Context değişkeni tutmamalıyız.

Eğer bunlardan birisini yaptıysak yazdığımız kodu tekrar gözden geçirmemiz faydalı olacaktır.

Eğer hangi context’i kullanmanız konusunda emin olamıyorsanız Application Context’i kullanın 🙂

 

Kaynaklar:

İyi kodlamalar,

 

Loading

Facebooktwitterredditpinterestlinkedinmail

Soyut Metodlar(Abstract Methods) ve Arayüzler(Interfaces)

Daire, dikdörtgen, veya diğer figürler için bir sınıf oluşturmak istersek her sınıfta figürü çizen çiz() ve figürü hareket ettiren taşı() metodları olmalıdır. Daire sınıfında, çiz() metodu ve taşı() metodu dairenin merkezi etrafında gezerek çizim yapar. Burada  çizim sınıfında iki metod ve bunlarla alakalı  sabit tanımlayıcılar tüm figür sınırları için geçerli olmaktadır.

 

public interface Sekil
{
final static int MAX_X_KOORD = 1024;
final static int MAX_Y_KOORD = 768;

/**
* Verilen koordinatın merkezinde şekil nesnesini oluşturur.
*
* @param x - cizilecek figürün x koordinatı.
* @param y - çizilecek figürün y koordinatı.
*/

void ciz(int x, int y);

/**
* Şekli verilen yeni koordinatlara hareket ettirir.
*
* @param x - taşınacak yeni konumun x koordinatı
* @param y - taşınacak yeni konumun y koordinatı.
*
*/

void tasi(int x,int y);

} // Şekil Arayüzü //

Şekil arayüzü iki sabit ve iki soyut metoddan oluşuyor. Arayüz sınıflarında bütün metod ve sabit tanımlayıcıları publictir. Tekrardan başına public yazmaya gerek yoktur. Başka bir sınıf bu arayüzü kullanmak istediğinde buna arayüzü implement eden sınıf denir. Örneğin daire sınıfı gözönüne alırsak :

 

public class Daire implements Sekil {

    // bildirim kısımları:

    private int xKoord,yKoord,yaricap;

    // x,y ve yaricap icin constructorlar

    public Daire(int xKoord, int yKoord, int yaricap) {
        this.xKoord = xKoord;
        this.yKoord = yKoord;
        this.yaricap = yaricap;
    }
    public void ciz(int x, int y) {
        xKoord = x;
        yKoord = y;
    }

    public void tasi(int x, int y) {

    }

    // ve diğer gerekli metodlar...

}

Arayüzlerde constructor bulunmaz çünkü constructorlar her zaman sınıfa özgüdür. Arayüzlerde bu eksiklik onların direk kullanımı engeller. Yani Sekil arayüzümüzden direkt olarak Sekil nesnesi oluşturamayız. Aşağıdaki şekildeki çağırım illegal olacaktır.

Sekil seklim = new Sekil(); // illegal

Loading

Facebooktwitterredditpinterestlinkedinmail

Yazılım Mühendisliği Nedir?

 

Yazılım mühendisliği bir modelleme(modeling) eylemidir. Yazılım mühendisleri karmaşa problemiyle modelleme yoluyla, sadece ilgili detay üzerine odaklanarak geri kalanları göz ardı ederek başa çıkar. Farklı yazılımlar için birden çok geliştirme modeli olabilir.

Yazılım mühendisliği bir problem-çözme(problem-solving) eylemidir. Modeller kabul edilir bir çözüm bulmak için kullanılır. Etkili sonucu bulma tecrübeyle doğru orantılıdır.

Yazılım mühendisliği bir bilgi-edinme(knowledge-acquisition) eylemidir. Yazılımı modellerken ve çözüm altyapısını oluştururken, yazılım mühendisleri veriler toplar bilgi olacak şekilde düzenler.

Yazılım mühendisliği mantığa-dayandırma(rationane-driven) eylemidir.  Bilgi edinildiğinde   sistem veya yazılım etki alanında karar verirken, yazılım mühendisleri hangi kararların hangi mantıksal sebeplerle verildiğini belirtir.

 

 

Loading

Facebooktwitterredditpinterestlinkedinmail