Anasayfa » Android, Java ve Java Teknolojileri

Android Programlama – lifeCycle, onPause(), onResume()

11 Temmuz 2012 6.138 kez okundu 6 yorum
1 Star2 Stars3 Stars4 Stars5 Stars (Henüz hiç oy kullanılmadı. İlk oyu siz verin.)
Loading ... Loading ...

Merhaba arkadaşlar,bugünkü uygulamamızda onPause(), onResume() metodları üzerinde duracağız. Bir önceki yazımızı okumayanlar buradan okuyabilir.  Okumak istemeyenler bir önceki uygulamayı indirip üzerinde devam edebilirler.

Diğer yazılarımız;

Bugünkü çalışmamızda uygulamamız çalışırken, meydana gelen lifecycle (yaşam döngüsü) dan bahsedeceğiz. Activity ler bir durumdan başka bir duruma geçerken aşağıdaki metodlar çalışır.

  • void onCreate(Bundle savedInstanceState)
  • void onStart()
  • void onRestart()
  • void onResume()
  • void onPause()
  • void onStop()
  • void onDestroy()
Biz bu metodları override ederek istediğimiz işlemleri yaptırabiliriz. Aşağıdaki diagram android uygulamasının lifecycle ını göstermektedir.  Mesela örnek verecek olursak. Bir uygulama çalışırken çağrı geldiğinde çalışan uygulamamız onPause() metodunu çalıştırarak beklemeye geçer. Bu arada uygulama arka planda çalışabilir. Çağrı bittiğinde ekrana gelen uygulamamız onResume() ile tekrar çalışmaya başlar. Diğerleride buna benzer yapılardır. onStop() ile uygulama durdurulur ama bellekte beklemeye devam eder. onDestroy()  ile tamamen ortadan kaldırırlır. pause ve stop durumlarında eğer cihazda yeterince bellek alanı kalmazsa işletim sistemi tarafından uygulama kapatılabilir.

Bugünkü yazımızda onPause() ve onResume() metodlarını kullanarak, arkaplanda çalışan bir uygulamayı yeri geldiğinde durdurup, yeri geldiğinde devap ettireceğiz.

Bunun için bir önceki uygulamamızda yazdığımız ve arkaplanda çalışan “iş” imizi daha da büyüteceğiz ve uzun sürmesini sağlayacağız. Yapmamız gereken değişiklik Runnable task metodunu 0 dan 30 a değilde 0 dan 100 e çıkarmak.

public void run() {
    		for (int i=progress;i<10000;i++) {
    			someWork(1);
    		}
	}

Şimdi ise activity miz kesintiye uğradığında thread çalışmasını durduracağız. Bunun için AtomicBoolean tipinde isActive adında class içinde yerel bir değişken tanımlıyorum.

	/**
	 * Activity mizin aktif olup olmadığını tutacak
	 */
	AtomicBoolean isActive = null;

ve initial olarak true değeri veriyorum

		/**
         * İnitial olarak activity miz çalışır durumda
         */
        isActive = new AtomicBoolean(true);

ayarladığımız bu yeni değişkene göre şimdi task() metodumuzu güncelleyelim ve isActive kontrolünü ekleyelim. Böylece false olduğunda loop dursun.

 /**
     * Yeni task oluşturarak yeni bir thread olarak çalıştırıyoruz
     */
    private Runnable task=new Runnable() {
    	public void run() {
    		for (int i=progress;i<10000 && isActive.get();i++) {
    			someWork(1);
    		}
	}

veee artık asıl işlemimiz olan onPause() metodunu yazmaya geldi sıra, override ederek şu şekilde dolduruyoruz. Tek yaptığımız isActive değişkenini false yapmak.

    /**
     * Program yarıda başka bir activity tarafından kesildiğinde çalışacak metod
     * 
     */
    @Override
    public void onPause() {
	    super.onPause();
	    isActive.set(false);
    }

Şimdi nasıl çalıştığına bir bakalım. Öncelikle ben şu şekilde test ediyorum.  isActive komutunu yoruma alıyorum. Böylece loopu kesmeyeceğiz.

/**
     * Program yarıda başka bir activity tarafından kesildiğinde çalışacak metod
     * 
     */
    @Override
    public void onPause() {
	    super.onPause();
	    //isActive.set(false);
    }

Programı çalıştırıyorum. ve Run komutunu veriyorum.

Daha sonra progress bar yarıya geldiğinde yeşil arama tuşuna basıyorum. Böylece başka activity devreye girecek ve onPause() çalışacak.

Biraz zaman geçtikten sonra geri tuşuna basıyorum.

ve progress barın kaldığı yerden devam ettiğini görüyorum.

Şimdi isActive değişkenimizdeki yorumu kaldıralım ve amaçladığımız şekilde çalışmasını inceleyelim.Amacımız neydi? Arama tuşuna bastığımızda onPause() çalışacak ve isActive false değerini alacak böylece progress bar geri tuşuna bastığımızda devam etmeyecek. Çünkü isActive değişkeni false olduğundan döngü bitecek. Yani başka bir activity araya girdiğinde progress bar beklemeyecek ve bitecek.

Ama biz onResume() metodunu da override ederek. Geri geldiğimizde progressbarı kaldığı yerden tekrar çalıştıracağız. Progress barı çalıştırmak için koşulumuz progress değişkeninin 0 değerinden büyük olması. Çünkü 0 ise progress bar daha önce çalışmamış demek ve bizim devam ettirmemize gerek yok.

Şimdi onResume() metodunu override edelim.

    /**
     * Program kesintiye uğradıktan sonra tekrar çalışmaya başladığında çalışan metod
     * 
     */
    @Override
    public void onResume() {
	    super.onResume();
	    isActive.set(true);
	    if (progress>0) {
	    startWork();
    }
    }

startWork() kodumuzuda ekleyelim.

    private void startWork() {
		setProgressBarVisibility(true);
		new Thread(task).start();
	}

Bu düzenlemeye göre ben onOptionsItemSelected() metodunda da şu değişikliği yapıyorum

	/**
	     * Çalıştır seçeneği seçildi ise
	     */
	    else if (item.getItemId()==R.id.run) {
	    	startWork();
	    }

Şimdi yine aynı  yöntemle test edebiliriz. Öncelikle run komutunu veriyoruz. O çalışırken yeşil arama tuşuna basıyoruz. Sonra geri tuşuna bastığımızda kaldığı yerden devam ediyor.

Çalışıyor ancak bir sorun var. Bir kez çalışıyor, ikinci kez denersek çalışmadığını göreceğiz. Bunu çözmek için  task() metodunda son bir değişiklik yapıyoruz.

/**
     * Yeni task oluşturarak yeni bir thread olarak çalıştırıyoruz
     */
    private Runnable task=new Runnable() {
    	public void run() {
    		for (int i=progress;i<10000 && isActive.get();i++) {
    			someWork(1);
    		}
    		/**
    		 * İşlem bittiğinde progress barı gizliyoruz.
    		 */
    		if (isActive.get()) {
    			runOnUiThread(new Runnable() {
	    			public void run() {
		    			setProgressBarVisibility(false);
		    			progress=0;
    			}
    		});
 
    	}
    	}
    	};

Son değişiklikle beraber bu yazımızın da sonuna geldik. Bu yazımızda Android işletim sisteminde yaşam döngülerinde çalıştırılan metodlardan ikisinin kullanımına örnek verdik. onPause() ve onResume() metodlarıyla programımız askıya alındığında arkada çalışan işi durdurup, geri geldiğinde bizde işi devam ettiriyoruz.
Takip etmeye devam edin!

Projenin kaynak kodlarını buradan indirebilirsiniz. Rar şifresi: www.kodmerkezi.net

<<< Önceki:

Sonraki: >>>


Facebookta Paylaş

6 yorum »

  • davut naci kaya dedi ki:

    Merhaba, aşağıdaki linkteki kaynak kodu paylaşılmış uygulamayı gerçekleştirdim, çıkış sayısını 8 olarak artırdım ve dimmer özelliğini de eklemeyi düşünüyorum. Ancak programın bir handikapı var geri tuşuyla yada ana menü tuşuna basıldığında program ile donanım arasındaki bağlantı kopuyor çıkışlar sıfırlanıyor. Geri ve menü tuşlarına basılsada programın geri planda çalışmasını ve donanımla bağlantısının kopmamasını nasıl sağlarız. Sizin bu yazınızdan yola çıkılarak birşeyler yapılabilir ama ben javada yeniyim bu background olayı biraz karmaşık geldi.Nasıl bir yol izlemeliyim teşekkürler.

    http://mitchtech.net/android-ioio-simple-digital-output/

  • admin dedi ki:

    Merhaba,
    Bahsettiğiniz şekilde uygulamanın arkaplanda çalışmaya devam etmesi için service kullanmanız gerekmektedir. onPause() ve onResume() ile sadece uygulamadan çıkış yapıldığında ve geri gelindiğinde çalıştırılabilir. Süreklilik sağlayamazsınız. Android service kullanarak programdan çıksanız dahi o arkaplanda çalışmaya devam eder. Kısa süre içinde service le alakalı yazı yazacağım.

  • davut naci kaya dedi ki:

    İlginiz için teşekkür ederim, service ve arkaplanda uygulama çalıştırma ile ilgili webde Türkçe bir bilgiye rastlayamadım, büyük bir boşluğu doldurmuş olursunuz iyi çalışmalar.

  • Veysel Boybeyi dedi ki:

    Merhaba,
    Yazılarınızı ilgiyle takip ediyorum. Android de uygulama yazma konusunda yeniyim. Kedi işlemi kolaylaştıracak bazı hesapların yapıldığı bir uygulama yaptım. Fakat Geri tuşu ile daha önce girdiğim activitelerden geri dönüyor ve en sonunda uygulamayı kapatıyorum. Fakat kısa bir süre sonra uygulama tekrar kendi kendine çalıyor. Tekrar geri tuşuna basarak kalıcı olarak programın kapanmasını saglıyorum. Acaba bu sorunu nasıl çözebilirim. Geri tuşunu kendim nasıl yönetebilirim. Geri tuşuna bastığımda programı ben yönlendirmek istiyorum uygulamanın ilk activitesine geldiğimde Geri tuşuna basarsam Uygulamadan çıkmak istiyormusunu sorusuna vereceğim cevapla çıkmasını yada devam etmesini nasıl sağlarım. Cevabınız için şimdiden teşekkür ederim.

  • admin dedi ki:

    Veysel,

    Geri tuşuna basıldığında işlem yapmak için onBackPressed() methodunu override etmen gerekiyor. Bu methodun içinde AlertDialog kullanarak kullanıcıdan çıkmak için onay alabilirsin.

  • Activity Kavramı ve Özellikleri | Gökhan YILMAZ dedi ki:

    […] yani yok edilebilir. Bu durum çok önemlidir!!! Kaynaklar : Mobikolik, DroidAddiction , KodMerkezi […]

Yorum Bırakın!

Yorum yaz, yada kendi sitende trackback (Geri besleme) olarak ekle. Ayrıca RSS ile bu konuya üye olabilirsin. .

Nazik olun. Temiz tutun. Konu dışına çıkmayın. Spam yaratmayın.

Bu tagları kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bloğumuz gavatarı desteklemektedir. Kendi gavatarınızı edinmek için lütfen Gravatar a üye olun.