Archive for May, 2009

iPhone Uygulamasında “Fading Splash Screen”

iPhone uygulaması başlarken, yüklenme sırasında bir grafik görüntülenebiliyor. Default.png adına bir imajı “Resource” klasörüne kopyalamanız yeterli.

Ancak daha hoş bir görünüm elde etmek mümkün. Bu grafiğin uygulama açılırken sönerek kaybolması güzel olurdu.

“Application Delegate” üzerinde birkaç değişiklik ile bu düzenlemeyi yapabilirsiniz.

1) Yeni bir “image view” ekleyelim.

UIImageView *splashView;

Yeni methodu header dosyasına ekleyelim.

- (void)startupAnimationDone:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context;

2)”applicationDidFinishLaunching” içinde en sona şu satırları ekleyebilirsiniz.

splashView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0, 320, 480)];
splashView.image = [UIImage imageNamed:@"Default.png"];
[window addSubview:splashView];
[window bringSubviewToFront:splashView];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.8];
[UIView setAnimationTransition:UIViewAnimationTransitionNone forView:window cache:YES];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(startupAnimationDone:finished:context:)];
splashView.alpha = 0.0;
splashView.frame = CGRectMake(-60, -60, 440, 600);
[UIView commitAnimations];

3) Aşağıdaki methodu ekleyelim.

- (void)startupAnimationDone:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
[splashView removeFromSuperview];
[splashView release];
}

Sonuçta uygulamanız aşağıdakine benzer  görüntüler ile açılacaktır.

fading2_sfading3_sfading4_s

,

5 Comments

Android’le Adım Adım Uygulama Geliştirme – III

Daha önceki iki bölümde döviz değerlerini gösteren basit bir uygulama geliştirmiştik. Ancak uygulamamız gibi düzenli aralıklarla güncellenmesi gereken değerlerinin olduğu uygulamalarda bu tarz güncelleme işlemlerinin kullanıcı etkileşimi olmadan arka planda çalışması beklenmektedir.
Android platformu arka planda çalışması beklenen iş akışları için “Service” altyapısı içermektedir. Bu yapı ile uygulamamız aktif olmasa bile çeşitli işlemlerin gerçekleştirilmesi sağlanabilmektedir. Çalışan service’ler, aktif olmayan/görüntülenmeyen Activity’lere daha yüksek bir önceliğe sahip olduğundan kaynak yönetimi tarafından daha etkin bir şekilde yönetilmektedirler.

Bir “Service” yaratabilmek için gerekli olan adımları 3 grupta toparlayabiliriz:

  • “Service” sınıfını extend eden bir sınıf hazırlanır
  • Bu sınıf içerisinde “onCreate”, “onStart” ve “onStop” metodları implement edilir
  • Uygulamanın AndroidManifest.xml dosyasında ilgili sınıf “service” tanımı içerisinde belirtilir
  • Bu adımlardan sonra hazırladığımız “Service” tanımını Context.startService ve Context.stopService metodları ile aktif ve pasif hale getirebiliriz.

    Bizde uygulamamız için döviz değerlerini alıp, veritabanına aktaran “CurrencyExchangeService” adında “Service” sınıfını extend eden bir sınıf hazırlayalım. Döviz değerlerini alıp, veritabanına aktarmak için “CurrencyExchangeActivity” sınıfındaki “getExchange” metodunu bu sınıf tanımında kopyalayalım (tabi içindeki gereksiz parçaları ayıklayarak).

    public class CurrencyExchangeService extends Service {
    	@Override
    	public void onCreate() {
    		super.onCreate();
    	}
     
    	@Override
    	public void onDestroy() {
    		super.onDestroy();
    	}
     
    	@Override
    	public void onStart(Intent intent, int startId) {
    		super.onStart(intent, startId);
    	}
     
    	@Override
    	public IBinder onBind(Intent intent) {
    		return null;
    	}
     
        public void getExchange() {
        ....
        }
     
        private class CurrencyExchangeHandler extends DefaultHandler {
        ....
        }
    }

    Bu “Service” tanımını aktif hale getirmek için ana Activity sınıfımızda “startService(new Intent(this,CurrencyExchangeService.class))” şeklinde bir metod çağrısı yeterli olacaktır. Bu metod ilk defa çağrıldığında “Service” sınıfındaki “onCreate” ve “onStart” metodlarını çalıştıracaktır. Sonraki çağrımlarında ise sadece “onStart” metodunu çalıştırır. Aktif haldeki “Service” tanımını iptal etmek için ise yine ana Activity sınıfımızda “stopService(new Intent(this,CurrencyExchangeService.class))” şeklinde bir metod çağrısı yapmamız yeterli olacaktır. Bu metod ilgili “Service” sınıfında “onStop” metodunu çalıştıracaktır.

    Ancak dikkat etmemiz gereken bir nokta, bu şekilde bir kullanımda “Service” sınıfında uygulamanın ana thread’i içinde çalıştığıdır. Mesela “onCreate” metodu içerisinde “getExchange” metodunu çalıştırdığım bir “Service” tanımının çalışması sırasındaki threadleri incelersek:

    public void onCreate() {
    	super.onCreate();
    	getExchange();
    }

    android-bolum3-1_ok

    Uygulamanın ana thread’i içerisinde çalıştığımızdan zaman isteyen işleyişlerde bu uygulamamızın kilitlenmesine neden olabilir.

    Bu durumu aşmak için yeni bir thread yaratıp, bu thread içerisinde iş akışını gerçekleştirmeyi deneyebiliriz. Yukarıdaki örnek için bunu şu şekilde gerçekleştirebiliriz:

    public void onCreate() {
    	super.onCreate();
        	Thread workerThread = new Thread(null,new Runnable(){
    			@Override
    			public void run() {
    				getExchange();
    			}},"currency_exchange");
        	workerThread.start();
    }

    Bu şekilde “Service” tanımını çalıştırıp, threadlerin durumunu incelersek, yeni thread’in yaratıldığını ve iş akışının bu yeni thread içerisinde çalıştırıldığını görebiliriz:

    android-bolum3-2_ok

    Yada eğer “Service” tanımı içerisinde belirli zaman aralıklarında tekrarlanmasını istediğimiz bir iş akışımız bulunuyor ise Android platformu ile gelen “Timer” sınıfını kullanabiliriz. Bu sınıf kendi içerisinde bir thread kullandığından bizim ekstra bir thread tanımı yapmamıza gerek kalmadan, iş akışımız Timer’a ait thread içerisinde çalışacaktır (Bu thread’i kapatmak için Timer.cancel metodunu kullanabilirsiniz).

    public void onCreate() {
    	super.onCreate();
    	Timer timer = new Timer();
    	timer.scheduleAtFixedRate(new TimerTask() {
    		@Override
    		public void run() {
    			getExchange();
    		}}, 0, 60*1000);
    }

    Bu şekilde “Service” tanımını çalıştırıp, threadlerin durumunu incelersek, iş akışının Timer’a bağlı thread içerisinde çalıştırıldığını görebiliriz:

    android-bolum3-3_ok

    Bir sonraki bölümde görüşmek üzere…

    , ,

    No Comments

    Android Emulator ile Test

    Daha önce bir Android uygulama geliştirme ortamı nasıl hazırlanır bahsetmiştik. Android 1.5 sürümü bu konuda bazı değişiklikler içeriyor, uygulamanızı hem 1.1 hem 1.5 hem de Google servisleri kullanmayan bir Android işletim sisteminde test etmenizi sağlayacak bir  yapı oluşturulmuş. Tahmin ediyorum ki bundan sonra çıkacak sürümleri de aynı yapı içerisinde test edebilmeyi destekleyeceklerdir.

    capture-4

    Testler için tabi ki Emulator’den yararlanacağız ama eskisinden farklı olarak artık her Android sürümü için birer sanal cihaz oluşturabiliyor,  üzerinde uygulamalarımızı hızlıca çalıştırabiliyor ve test edebiliyor olacağız.

    Uygulamanızı farklı Android sürümleri için test etmek için yapmanız gerekenler:

    • Her Android işletim sistemi için birer Android Virtual Device (adv) oluşturmak
    • Uygulamanızı her Android sürümü için ayrı ayrı build etmek
    • Her Android Virtual Device (adv) için uygulamanızı çalıştırıp test etmek

    Eğer en geniş Android kullanıcı kümesine hitap etmek istiyorsanız, olabilecek tüm Android sürümlerinde uygulamanızı çalışır hale getirmeniz gerekir.  Bunun en kolay yolu Emulator’den faydalanmak.

    Birinci adım olarak her Android sürümü için birer Virtual Device oluşturmalısınız:

    • Komut satırından Android SDK’sının altında tools dizinine gidin.
    • Aşağıdaki komutla oluşturabileceğiniz device listesi gelecektir:
    D:\android\android-sdk-windows-1.5_r1\tools>android list target
    Available Android targets:
    id: 1
    Name: Android 1.1
    Type: Platform
    API level: 2
    Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
    id: 2
    Name: Android 1.5
    Type: Platform
    API level: 3
    Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
    id: 3
    Name: Google APIs
    Type: Add-On
    Vendor: Google Inc.
    Description: Android + Google APIs
    Based on Android 1.5 (API level 3)
    Libraries:
    * com.google.android.maps (maps.jar)
    API for Google Maps
    Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P
    • Her id için bir Virtual Device oluşturabilirsiniz, aşağıda 3 adet device oluşturan komut yer alıyor:
    android create avd --name Android1.1 --target 1
    android create avd --name Android1.5 --target 2
    android create avd --name AndroidWithGoogle --target 3

    İkinci adımda,  uygulamınızı seçeceğiniz bir device için build etmeniz gerekiyor:

    • Bunun için Project Explorer’da projenizin üzerinde sağ tıklayıp Properties ekranına gidiyoruz.
    • Burada Android seçeneğine geliyoruz.
    • Project Build Target menüsünden istediğimiz sürümü seçiyoruz.
    capture-7

    Bu işlemden sonra Eclipse otomatik olarak projeyi yeniden build edecektir. Eğer sürümler arası API kullanım farklılıkları varsa burada ortaya çıkacaktır.

    Üçüncü ve son adımda uygulamanızı daha önce oluştruduğunuz bir virtual device üzerinde çalıştıracaksınız:

    • Eclipse’in Run menüsünde Run Configuration bölümüne gidilir.
    • Android Applicaiton bölümü için New Launch Configuration düğmesine basılarak konfigürasyon ekranı açılır.
    • Target sekmesine gittiğinizde, projenizi build ettiğiniz sürümüne uygun olan device’ların listesini göreceksiniz.
    • Burada Deployment Target Selection Mode’u  Manual bırakıp her uygulamayı Run ettiğinizde istediğiniz bir device seçebilir ya da Automatic bölümünde seçeceğiniz bir device için otomatik çalışmasını sağlayabilirsiniz.

    capture-8

    • Manual  bırakıp uygulamayı çalıştırdığınızda aşağıdaki gibi bir ekran gelecek, bu ekranda varsa bilgisayarınıza bağlı telefonunuzu görebiliyor ve isterseniz uygulamanızı bu cihazda çalışmasını sağlayabiliyorsunuz.

    capture-3

    Virtual device yaratırken neden Android1.5 ve Google API diye iki seçenek olduğunu merak ediyor olabilirsiniz. Şu ana kadar çıkan Android’li telefonlar, Google hesabınızla giriş yaptığınız ve her yerde Google servislerinin bulunduğu cihazlardı. Mesela Gmail,Calendar,Contacts,Latitude,GTalk gibi programların hiç birine ayrı ayrı hesaplarla giriş yapmıyoruz, telefonu aktive ederken kullandığımız Google hesabı sayesinde tüm uygulamaları hesabımızla entgre olarak kullanabiliyoruz.

    Ama işin bir başka yanı var, Andorid açık kaynak kodlu bir işletim sistemi olduğu için dileyenler bu işletim sistemini Google servislerini barındırmayacak şekilde bir dağıtım oluşturup kullanabilir. Bu tip cihazlarda da yazdığınız uygulamayı test etmek isteyebilirsiniz, bunun için Android 1.5 device’ını kullanmalı, Google ile entegre çalışan cihazlar için ise Google API device’ını kullanmalısınız.

    No Comments