Bir Activity Durdurmak ve Yeniden Başlatmak
Düzenli
bir durdurma ve yeniden başlatma işlemi kullanıcın activity’nize geri
döndüğünde sürekli aktif ve kullanıcı bilgilerinin korunması için önemli bir
işlem sürecidir. Activity’nizin durdurulup yeniden başlatılmaya ihtiyaç
duyacağı birkaç senaryodan bazıları aşağıdaki gibi olabilir.
·
Kullanıcı Recent Apps( son kullanılan Uygulamalar)
menüsünü açıp farklı uygulamalara geçiş yapabilir. Bu durumda uygulamanızın
ekranda bulunan activity örneği durdurulur. Kullanıcı ana ekranda yer alan
bulunan uygulama ikonunuza dokunduğunda veya Recent Apps penceresinden geri
geldiğinde activity yeniden başlatılır.
·
Kullanıcı uygulamanız içinden yeni bir activity
başlatacak bir işlem gerçekleştirdiğinde mevcut activity durdurulur ve diğer
activity başlatılır. Kullanıcı back butonun bastığında ilk activity tekrar
başlatılır.
·
Kullanıcı uygulamanızı kullandığı anda bir çağrı
alınca…
Activity sınıfı, uygulamanızın durdurulması ve yeniden
başlatılması gibi durumlarda uygulamanızın nasıl davranacağına karar vermek
için onStop() ve onRestart() gibi iki yaşam döngüsü metodu tanımlar. Paused
durumdan farklı olarak, (kısmen UI arka plana itildiği durum olarak tanımlanan)
stopped durum UI nin tamamen arka plana atılmasını ve hiçbir şekilde
görünmemesini garanti ederek activity den kullanıcının dikkatini tamamen keser.
NOT:
Sistem Activityniz stopped duruma geçtiğinde bu activitynin
bir örneğini bellekte sakladığı için, onStop() veya onRestart() metodunu
uygulamanıza gerek kalmaz. Hatta onStart() metodunu bile uygulamanız
gerekmeyebilir. Birçok activity nispeten basittirler ve çok rahat bir şekilde
durdurulup başlatılabilirler ve size sadece süregelen işlemleri durdurmak için
onPause() metodunu kullanmak kalır.
Kullanıcı activity’nizden ayrıldığında, sistem onStop() metodunu çağırarak activity i
durdurur(1). Activity durdurulduğunda kullanıcı geri gelirse, sistem onRestart()(2) metodunu çağırır ve bunu hızlıca onStart()(3) ve onResume()(4)
metodu takip eder. Dikkat etmeniz gereken asıl konu ise ne türlü bir senaryo
gerçekleşecek olursa olsun, sistem onStop()
metodundan evvel onPause() metodunu çağırır.
Activity Durdurmak
Activity’niz
onStop() metodunu çağırdığında, bu demek oluyor ki artık bu activity daha fazla
görünmeyecek ve kullanıcının ihtiyaç duymadığı ne kadar kaynak var ise serbest
bırakılacak demektir. Activity’niz durdurulduğunda, sistem kaynağına ihtiyaç
var ise bu activity örneği yok edilecektir. Diğer bellek gerektiren ekstra
durumlarda, sistem uygulamanızı onDestroy() metodunu çağırmaya ihtiyaç duymadan
sonlandırabilir. Bu nedenle onStop() metodunu kullanmanızdaki en büyük fayda
sistemin bu yola başvurmadan evvel sizin sistem kaynaklarını serbest
bırakmanızdır.
onPause()
metodu onStop() metodundan evvel çağırılmasına rağmen, aşırı sistem kaynağını
tüketen işlemleri sonlandırmak için onStop() metodunu kullanmanız her zaman
daha verimli bir işlem olacaktır.
Aşağıdaki
örnekte, onStop() metodunun bir uygulaması görülmektedir. Bu uygulama ile
geçici belleği not defterinde tutulan kayıtların kaydedilme işlemi icra
ediliyor.
ÖRNEK:
@Override
protected void onStop() {
super.onStop(); // Always call the superclass method first
// Save the note's current draft, because the activity is stopping
// and we want to be sure the current note progress isn't lost.
ContentValues values = new ContentValues();
values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
getContentResolver().update(
mUri, // The URI for the note to update.
values, // The map of column names and new values to apply to them.
null, // No SELECT criteria are used.
null // No WHERE columns are used.
);
}
protected void onStop() {
super.onStop(); // Always call the superclass method first
// Save the note's current draft, because the activity is stopping
// and we want to be sure the current note progress isn't lost.
ContentValues values = new ContentValues();
values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
getContentResolver().update(
mUri, // The URI for the note to update.
values, // The map of column names and new values to apply to them.
null, // No SELECT criteria are used.
null // No WHERE columns are used.
);
}
Activity’niz
durdurulduğunda, Activity nesnesi bellekte bir yer tutar ve yeniden
çağırıldığında activity devam eder. Bu süreç içerisinde uygulamanızın
bileşenlerini yeniden hazırlamanız gerekmemektedir. Sistem ayrıca mevcut duruma
ait her bir View’in izini de saklar. Böylece
kullanıcı EditText öğesine bir veri girişi
yaptığında bu otomatik olarak, sizin herhangi bir saklama prosedürü
uygulamanıza gerek kalmadan saklanır.
NOT:
Stopped durumda sistem activity’nizin yok etse bile, bu
activitye ait View nesnelerinin durumlarını Bundle
içerisinde korur ve kullanıcı aynı activity örneğine geri döndüğünde UI nin son
haliyle uygulama çalışmaya devam eder. ( Bir sonraki konuda Bundle hakkında daha detaylı bilgi aktaracağız)
Bir Activity’nin Başlatılması/Yeniden Başlatılması
Activityniz
Stopped durumdan tekrar ön plana geldiğinde, onRestart()
metoduna geçer. Ayrıca sistem, activityniz her ön plana geldiğinde olduğu gibi onStart() metodunu da çağırır. onRestart() metodu sadece activity stopped
durumdan devam ederken çağırılır. Böylece öncelikle stopped duruma geçen
uygulamanız için bazı özel restorasyonları gerçekleştirme imkânı elde etmiş
olursunuz.
Uygulamanın
activity durumunu onRestart() metodu ile
restore etmesi aslında çok yaygın bir kullanım değildir. Çünkü genel uygulama
dünyasında bu tarz bir yönetime pek ihtiyaç duyulmamaktadır. onStop() metodu activitynizin kullandığı tüm
kaynakları temizlemek için uygulanmalıdır. Ancak bu işlem sonrası Activity
yeniden çağırıldığında durdurduğunuz tüm işlemleri yeniden hazırlamanız
gerekecektir. Bunun yanında Activity’niz yeniden oluşturulduğu durumlarda da bu
hazırlıkları yapmanız gerekcektir.( hiçbir şekilde activity örneğinizin
olmadığı durum). Bu nedenle, onStop()
metoduna karşılık olarak her zaman onStart()
metodunu kullanmalısınız. Böylece hem onRestart()
metodunu hem de onStart() metodunu kullanmak
durumunda kalmamış olursunuz. Çünkü sistem yukarıda bahsettiğimiz gibi
activitye dönüldüğü anda, onStart() metdounu
her iki durumda da çağıracaktır.
Kullanıcı uygulamanızdan uzun
süreliğine ayrıldığında, uygulamanıza geri dönmeden evvel onStart() metodu
gerekli sistem ihtiyaçlarını ve özelliklerini doğrulamak için doğru metot
olacaktır.
ÖRNEK:
@Override
protected void onStart() {
super.onStart(); // Always call the superclass method first
// The activity is either being restarted or started for the first time
// so this is where we should make sure that GPS is enabled
LocationManager locationManager =
(LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!gpsEnabled) {
// Create a dialog here that requests the user to enable GPS, and use an intent
// with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
// to take the user to the Settings screen to enable GPS when they click "OK"
}
}
@Override
protected void onRestart() {
super.onRestart(); // Always call the superclass method first
// Activity being restarted from stopped state
}
protected void onStart() {
super.onStart(); // Always call the superclass method first
// The activity is either being restarted or started for the first time
// so this is where we should make sure that GPS is enabled
LocationManager locationManager =
(LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!gpsEnabled) {
// Create a dialog here that requests the user to enable GPS, and use an intent
// with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
// to take the user to the Settings screen to enable GPS when they click "OK"
}
}
@Override
protected void onRestart() {
super.onRestart(); // Always call the superclass method first
// Activity being restarted from stopped state
}
Sistem activitynizi yok ettiğinde, Activity için onDestroy()
metodunu çağırır. onDestroy() metodunun çağırılmasına ihtiyaç kalmıyor, çünkü
genellikle uygulamanızın kullanmış olduğu birçok sistem kaynaklarının onStop()
metodunda durdurulması gerekmektedir. Fakat bu metot sistem kaynaklarının
gereksiz kullanımını durdurmak için son şansınız demektir. Bu metot ile en son
durdurmak isteyeceğiniz işlemleri tanımlamanız cihaz sistem kaynakları için çok
önemlidir. Bunun üzerinde durmamızın sebebi uygulamanızın çalışma performansını
ve kullanıcı deneyimin yüksek düzeyde tutmayı amaçlamamızdır.