Aktivite kullanıcıların bir işlem yapmak için kullandığı ekran oluşturan bir uygulama bileşenidir. Bu işlemler telefon çevirme, fotoğraf çekme, e-mail gönderme gibi faaliyetleri içerir. Her aktivite aslında genellikle ekranı dolduran ve diğer pencerelerin üzerinde olan bir penceredir.
Bir uygulama birbiriyle bağlantılı birden fazla aktiviteden oluşur. Uygulama içindeki bir aktivite ana (main) aktivite olarak tanımlanır ve uygulama ilk çalıştırıldığında kullanıcı bu ekranı görür. Her aktivite farklı işlemler gerçekleştirmek için bir diğeri aktiviteyi çağırabilir. Yeni bir aktivite çalıştığında, önceki aktivite durdurulur, ancak sistem tarafından stack adı verilen bellek biriminde tutulur.
Yeni çalıştırılan bir aktivite nedeniyle bir aktivite durdurulduğunda, bu durum değişikliği aktivitelerin yaşam döngüsü metotları tarafından aktiviteye bildirilir. Durumundaki değişikliklere bağlı olarak, aktivitelerin alabileceği bir kaç metod vardır. Sistem aktiviteleri oluşturarak, durdurarak, tekrar başlatarak veya yok ederek gerçekleştirdiği durum değişikliklerinde, duruma uygun olarak özel işlemlerin yapılabilmesine olanak sağlar. Örneğin, durdurulduğunda, bir aktivite ağ ve veritabanı gibi büyük nesneleri serbest bırakmalıdır. Aktivite devam ettiğinde, gerekli kaynaklar tekrar elde edilir ve işlemler devam eder.
Bir aktivite oluşturmak için, Activity sınıfından veya bu sınıftan türetilmiş bir sınıftan bir alt sınıf türetmeniz gerekir. Oluşturduğunuz sınıf içinde, bir aktivite oluşturulduğunda, durdurulduğunda, devam ettiğinde veya yok edildiğinde yaşam döngüsündeki farklı durumlar arasında bir aktivitenin yaptığı geçişler esnasında sistem tarafından çağrılan geri çağrı metotlarının kod kısımlarını oluşturmanız gerekir.
En önemli geri çağrı metotları:
onCreate()
Bir aktivite oluşturulduğunda çağrılan bu metodun kodlarını yazmanız gerekir. Kodlar içinde, aktivitenizin önemli bileşenlerini başlatmanız gerekir. Daha da önemlisi, setContentView() fonksiyonunu çağırarak aktivite kullanıcı arabirimini oluşturmanız gerekir.
onPause()
Kullanıcı bir aktiviteyi kullanmayı bıraktığında, sistem bu metodu çağırır. Burada, yapmanız gereken değişiklikleri uygulamanız gerekir.
Bir aktivitenin kullanıcı arayüzü View sınıfından türetilen nesneler tarafından sağlanır. Her bir view kontrolü aktivite penceresi içinde belirli bir dikdörtgen alanı kontrol eder ve kullanıcı işlemlerine karşılık cevap verir. Örneğin, kullanıcı tıkladığında belirli bir işlem yapan bir buton bir view'dır.
Android, program arayüzünü oluşturmak için kullanabileceğiniz bir çok hazır view sağlar. Widget'lar ekran için görsel ve interaktif özelliği olan buton, metin alanı, checkbox gibi view'lardır. Ekran görüntüsü (layout) ViewGroup sınıfından türetilen ve çocuk view'ları için linear, grid veya relative görüntü gibi benzersiz bir görüntü sağlayan view'lardır. Aynı zamanda, kendi widget ve görüntülerinizi oluşturmak ve aktivite ekranınıza uygulamak için View ve ViewGroup sınıflarından veya mevcut alt sınıflarından yeni sınıflar türetebilirsiniz.
View'lar kullanarak görünüm tanımlamanın en yaygın yöntemi uygulama kaynakları arasına kaydedilen XML görüntü dosyası kullanmaktır. Bu yöntemle, programın kullanıcı arayüzünü aktivitedeki işlemleri yönlendiren kaynak kodlarından bağımsız olarak tanımlamış olursunuz. Aktiviteniz için kullanıcı arayüzünün görüntüsünü kaynak ID'sini setContentView() metodu ile kullanarak ayarlayabilirsiniz.
Sistem tarafından giriş yapılabilmesi için, aktivitenizin bildirimini manifest dosyasında yapmanız gerekir. Aktivitenin bildirimini yapmak için manifest dosyasını açın ve <application> elemanının alt elemanı olarak bir <activity> elemanı ekleyin:
<manifest ... > <application ... > <activity android:name=".ExampleActivity"/> ... </application ... > ... </manifest>
Bu eleman içine eklenebilecek aktivite adı, ikonu ve arayüzü gibi bir kaç tane özellik daha vardır. Burada, mutlaka tanımlanması gereken tek özellik aktivitenin sınıf adını gösteren android:name özelliğidir. Uygulamanızı yayınladıktan sonra, bazı işlemler devre dışı kalacağından, bu adı değiştirmemeniz gerekir.
<activity> elemanı, diğer uygulamalara ait bileşenlerin çalıştırma yöntemlerini belirlemek için <intent-filter> elemanını kullanarak farklı intent filtreleri tanımlayabilir.
Android SDK aracını kullanarak yeni bir uygulama oluşturduğunuzda, otomatik olarak oluşturulan aktivite, ana işleme karşılık veren bir aktivite bildirimini yapan ve launcher kategorisine yerleştirilmesi gereken bir intent filtre içerir:
<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
<action> elemanı burasının uygulamanın ana girişi olduğunu gösterir. <category> elemanı bu aktivitenin kullanıcıların bu aktiviteyi çalıştırması için sistem uygulama başlatıcısında listelenmesi gerektiğini gösterir.
Eğer uygulamanızda yer alan aktivitelerin diğer uygulamalar tarafından çalıştırılmasını istemiyorsanız, yukarıda gösterilenler dışında intent filtre tanımlamanıza gerek yoktur.
startActivity() metoduna başlatmak istediğiniz aktiviteyi gösteren bir Intent nesnesini parametre olarak geçirerek bir aktiviteyi başlatabilirsiniz. Intent nesnesi başlatmak istediğiniz aktiviteyi veya gerçekleştirmek istediğiniz işlemi tanımlar. Sistem diğer uygulamalar içinde de olsa uygun olan aktiviteyi bulur ve başlatır.
Kendi programınız içinde, bir aktiviteden diğer bir aktiviteyi çağırmak için aşağıdaki komut satırlarını kullanabilirsiniz:
Intent intent = new Intent(this, AnotherActivity.class); startActivity(intent);
Uygulamalar, bir aktivite içinde yer alan verileri kullanarak bir eposta göndermek gibi bir işlem yapmak istediğinde, android cihaz içinde yer alan diğer uygulamalarda bulunan aktiviteleri kullanarak bu işlemi gerçekleştirir. Bu durumda uygulama sadece yapmak istediği işlemi gösteren bir Intent oluşturur ve sisteme bildirir. Sistem bu işlemi yapacak uygun aktiviteyi çalıştırır. Eğer aynı işlemi yapabilecek birden fazla aktivite varsa, kullanılacak olan aktiviteyi kullanıcı belirler. Aşağıdaki satırlar kullanıcının bir eposta göndermesini sağlar:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); /* epostanın gideceği adres */
startActivity(intent);
Bir aktiviteyi sonuç alacak şekilde başlatmak için startActivityForResult() metodu, başlatılan aktiviteden elde edilen sonuçları elde etmek ve işlem yapmak için ise, onActivityResult() metodu kullanılır.
Bir aktivitenin finish() metodunu kullanarak aktiviteyi kapatabilirsiniz. Daha önceden başlatmış olduğunuz bir aktiviteyi kapatmak için de finishActivity() fonksiyonunu kullanabilirsiniz.
Android sistemi bir aktivitenin ömrünü uygulamanız için yönettiğinden, bir aktiviteyi yukarıdaki metotları kullanarak sona erdirmemeniz tercih edilir.
Kaliteli ve esnek uygulamalar geliştirmek için gerekli metotları kullanarak program içindeki aktivitelerin yaşam döngüsünü yönetmek çok önemlidir.
Bir aktivite üç farklı durumda bulunabilir:
Resumed (Çalışmakta)
Aktivite ekranda en önde bulunmaktadır ve kullanıcı aktivite üzerinde çalışmaktadır.
Paused (Ara verilmiş)
Başka bir aktivite ekranın en önündedir ve kullanıcı üzerinde çalışmaktadır, ancak ara verilmiş aktivite halen görülmektedir. Şöyleki, ara verilmiş aktivite üzerinde yer alan ve çalışan başka bir aktivite kısmen transparandır veya ekranın tamamını kaplamamaktadır. Ara verilmiş bir aktivite bellekte kalmaya devam eder ve pencere yönetecisine bağlıdır. Ancak, belleğin çok yetersiz olduğu durumlarda sistem tarafından sona erdirilebilir.
Stopped (Durdurulmuş)
Aktivite başka bir aktivite tarafından tamamen devre dışı bırakılır. Durdurulmuş aktivite bellekte kalmaya devam eder, ama pencere yöneticisine bağlı değildir. Kullanıcı tarafından görülmez ve ihtiyaç duyulduğunda, sistem tarafından sona erdirilir.
Eğer bir aktiviteye ara verilir veya durdurulursa, sistem aktivitenin finish() metodunu kullanarak veya aktivitenin process'ini sonlandırarak aktiviteyi bellekten siler. Aktivite tekrar açıldığında, yeni baştan oluşturulması gerekir.
Aktivite farklı durumlar arasında geçiş yaptığında, farklı metodlar kullanılarak aktiviteye bildirimler gönderilir. Bu metotların içinde ilgili durum geçişi esnasında yapmak istediğiniz işlemleri yapabilirsiniz. Aşağıdaki örnek aktivite içinde temel yaşam döngüsü metotları gösterilmektedir:
public class OrnekActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // super sınıf fonksiyon çağrısı // Aktivite oluşturulmak üzeredir. } @Override protected void onStart() { super.onStart(); // super sınıf fonksiyon çağrısı // Aktivite ekranda gösterilmek üzeredir. } @Override protected void onResume() { super.onResume(); // super sınıf fonksiyon çağrısı // Aktivite tekrar ekranda gösterilmek üzeredir. } @Override protected void onPause() { super.onPause(); // super sınıf fonksiyon çağrısı // Başka bir aktivite devrededir (bu aktivite durdurulmak üzeredir). } @Override protected void onStop() { super.onStop(); // super sınıf fonksiyon çağrısı // Aktivite görünür değildir (durdurulmuştur). } @Override protected void onDestroy() { super.onDestroy(); // super sınıf fonksiyon çağrısı // Aktivite yok edilmek üzeredir. } }
Yukarıda gösterilen tüm metotlar herhangi bir işlem gerçekleştirmeden önce super sınıf (üst sınıf) metodunu çağırmalıdır.
Yukarıda bahsi geçen metotlar bir aktivitenin tüm yaşam döngüsünü belirler. Bu metotları çalıştırarak, aktivitenin yaşam döngüsünde üç adet içiçe döngüyü kontrol edebilirsiniz.
Aktivitenin tüm zamanı
onCreate() ve onDestroy() metotlarına yapılan çağrılar arasında geçer. Aktiviteler OnCreate() fonksiyonu içinde ekran görüntüsünün oluşturulması gibi işlemleri ve onDestroy() içinde ise tüm kaynakları serbest bırakma işlemlerini gerçekleştirmelidir.
Aktivitenin görünür zamanı
onStart() ve onStop() metotlarına yapılan çağrılar arasında geçer. Bu zaman süresince, kullanıcı aktiviteyi cihaz ekranında görür ve işlem yapar. Bu iki metod arasında, aktiviteyi kullanıcıya göstermek için gereken kaynakları sağlayabilirsiniz. Bu iki metod aktivitenin kullanıcıya gösterilmesi ya da kullanıcıdan gizlenmesi için birden fazla kullanılabilir.
Aktivitenin ön plan zamanı
onResume() ve onPause() metotlarına yapılan çağrılar arasında geçer. Bu zaman süresince, aktivite diğer tüm aktivitelerin önünde yer alır ve kullanıcı aktivite üzerinde işlem yapar.
Aşağıdaki şekil aktivitelerin uyguladıkları döngüleri, durumlar arası geçişlerde izledikleri yolları göstermektedir: