Ara
18
2011

Android İle Otomasyon Simülasyonu

ANDROID İLE UYUGLAMA GELİŞTİRMEK

ÖĞRENCİ BİLGİ SİSTEMİ SİMÜLASYONU

ÖZET

Uygulama genel olarak SQLite kullanımı pekiştirmek ve animasyonları kullanmak adına örnekleri içermektedir.
SQLite veritabanını verimli kullanmak adına yapılan katmanlı mimarinin katmanlarının içerisinde de katmanlı bir hiyerarji mevcuttur. Veritabanı oluşumu için oluşturulan sınıfın sorgu yapmak için oluşturulan bir sınıf dahilinde yürütülmesi ve sınıfların içerisinde de zaman zaman methodlar ile katman oluşturulmaya çalışılmıştır.
Animasyonlar ile kullanıcının görsel zevkini tatmin edecek düzeyde zengin bir tasarım amaçlanmıştır.
Dialoglar ile de activitylerin görevleri paylara bölünmekle beraber pencere içerisinde fonksiyonel zenginlik arttırılarak gereksiz yere activity oluşumu engellenmişdir.

Uygulamaya Giriş

Activities

Activityler layout tasarımını ekranda görüntülemeyi sağlarlar.

Android uygulamaların sadece bir activity diğerlerinden farklıdır. Main activity uygulamanın çalıştırıldığında ekranda yapılan işlemler üzerinde etkili olan activitydir. AndroidManifest içerisinde bu activity nin tanımının main activity formatında yapılması gerekir. Program sonlanacağı zaman sonlanır. Diğer activityler main activity üzerinden çağırıldığından aksi düşünülemez zaten.

Activityler arası durum yönetimi ve kontrolünü android back-stack kullanarak sağlar. Back-stack; activity leri L.I.F.O.(last in first out) algoritmasına göre bir kuyruğa yerleştirir. Böylece geçmiş activityleri stop konumunda tutuğu için onlara ulaşılması da kolaylaşır.

Activity de kendi layout için pencere ve olay sağlamaktadır. Activity bunu yaparken kendi call-back methodlarından yardım alır. ‘onCreate’ methodu ile pencerenin oluşmasını ve parçacıkların ekrana yerleşmesini sağlar. Actvity ilk oluştuğunda da doğal olarak ‘onCreate’ methodu çağırılmaktadır. Bu methodun hazırlık methodu olarak düşünebiliriz. ‘onDestroy’ ise bunun zıttıdır, activity e ait yıkım methodudur. Bu method çağırıldığında açık olan veritabaı bağlantılarını kapatabilmek gibi işlemler yapabliriz. Aktif activity dışında bir başka activity çağırıldığında ise aktif activity ‘onPause’ methodunda çok kısa bir süre kaldıktan sonra ‘onStop’ methoduna yönelir ve etkin olabilmek için ‘onRestart’ methodunun çağırılması bekler yahut sonlanmak için ‘onDestroy’ ya yönlenir. Activitylerin çalışma prensipleri genel olarak bu şeklide işlemektedir.

Resources

Values; android uygulamalarımızda statik verileri depolayacağımız xml dosyalarıdır. ‘res’ dizini altında ‘values’ altında bulunurlar. Erişim çok kolaydır. Hem layout bölümünde hem de java sınıflarımızda rahatlıkla erişebiliriz. Java sınıflarımızda ‘Resources’ sınıfını kullanarak bir object üretiriz. Activity’nin ‘getResources()’ methodu ile referans oluşturarak bir resources objesine sahip oluruz. Layout içerisinde erişim için ‘@’  işareti ile birlik te resourcesin türünü belirleyen tagı kullanırız.(renk için @color string için @string gibi)Büyük uygulamalar için kod takibini ciddi ölçüde kolaylaştırmaktadır.

Layout; ‘res’ dizini altında bulunan bu dizin içerisinde uygulama tasarımlarımız yer alır. Genel olarak pencere üzerinde parçacıkların yerleşimini belirleyen main layout bulunur. FrameLayout, TableLayout, LinearLayout ve Relative Layout olamak üzere dört farklı layoutumuz bulunur. (AbsoluteLayout android tarafından deprecated olarak etiketlenmişdir.)Üç layoutun yerleşim farkları bulunur uygun kombinasyonlar ile amaçladığımız layouta ulaşabilriz. Ayrıca main layoutun içerine sınırsız sayıda child layout oluşturabliriz. Parçacıkların yerleşimi için tanımlanmış üç tane tip bulunur. Bunlar ‘wrap_content’, ‘match_parent’ ve ‘fill_parent’ dır. ‘wrap_content’ parçacığın varsayılan boyutudur.(İçerisinde bulunan text verisi ile de ilgisi vardır. Button’ un içerisinde yazan textte göre uzunluğu ya da boyu artabilir.)’match_parent’ üzerinde bulunduğu layoutu ve aynı layout üzerinde bulunan diğer parçacıklara göre şekli alır. Yani beraber üzerinde bulundukları layouttan kalan eni ya da boyu doldurur. ‘fill_parent’ üzerinde bulunduğu layoutun enini ya da boyunu doldurur.

Animasyonlar; layout ve values gibi ‘res’ dizinin altında ‘anim’ içerisinde yer alırlar. ‘translate’ türündeki animasyonlar kaydırma yapmaktadır. Sağdan sola yukarıdan aşağıya gibi. ‘alpha’ ise aydınlanma ya da kararma yapabilmektedir.(Uygulama içerisinde diğer animasyonlar kullanılmadığı için tanımları yapılmamıştır.) Animasyonların etkin oldukları milisaniye cinsinden bir süreleri vardır. Animasyonların aynı anda bitebilmesi için sürelere dikkat edilmelidir.

Drawable; ‘res’ dizinin altında yer alır. Uygulamanın resimlerinin depolandığı yerdir. Ayrıca uyguladaki resimleri belirli şartlar altında değiştirebileceğimiz xml dosyası oluşturmamızı sağlar. Örneğin; parçacığın default resmini üzerine tıklanınca değiştirebliriz.

Sound; sesleri ‘res’ dizini altında oluşturduğumuz ‘raw’ dizinine kaydediyoruz. Diğer resourcesler ile pek farkı yoktur. Yalnız sesin çalması için bir ‘MediaPlayer’ objesi oluşturmamız gerekiyor. Bu objeye de işleteceği media dosyasını gösterirken ‘R.raw.sound’ şeklinde kullanıyoruz.

SQLite; Gömülü sistemlerde ve telefonlarda hafifliğinden dolayı kullanışlı bir veri tabanıdır. Android de üzerine yazılan katman ile sorgular kolaylıştırılmıştır. Standart SQL sorgular yerine methodlar ile ihtiyacımızı karşılıyabiliyor.

Uygulamanın Yazılım Mimarisi


Uygulama içerisindeki activitylerin hiyerarjisi yukarıdaki gibidir. KodcuComExample; uygulamanın ilk ekranına sahipdir. İlk ekranda kullanıcı kontrolü yeni kullanıcı kaydı yapılıyor. MainPageForUser ise öğrencilerin ders notlarının görüntülendiği öğretmenlerde ise vermek de yükümlü olduğu derse ait öğrenci sınav notları görüntüleniyor. Ayrıca kullanıcı adı ve şifre güncellemesi yapılabliyor. Yani sistem giren kişinin statüsüne göre işlem yaptırıyor.

Şimdi de activityleri sahip oldukları layoutlar ile birlikte inceleyelim.

Activity’ nin esas yerleşimini main.xml içeriği sağlarken activity nin sahibi olduğu bir dialog için ise signupdialog.xml den yararlanıyor. main.xml içerisindeki parçacıkların bazıları animasyonlar ile görselliği artrılmıştır. Animasyonlar için AnimationUtils sınıfı kullanılarak resources içerisindeki gerekli animasyon kullanılabilir. Ardından da parçacığa ait startAnimation methoduna istenilen animasyonun verisi gönderiliyor.

Pencere ekrana geldikten sonra sıra geldi kullanıcı işlemlerine. Kullanıcı bilgilerini ekranda görünen edittextlere yazdıktan sonra LOGIN buttonuna basmalıdır. Buttona basdıktan sonra bir veri tabanı işlemi gerçekleşir. Readable bir veritabanı işlemi oluşturulacağını bildirir ve veritabanına sorgu yapabilmek için SQLiteDatabase sınıfına ait bir object kullanır.(Database işlemlerinden daha sonra bahsedilecektir.)
Bilgileri sisteme kayıtlı bilgiler ile eşleşmiyorsa sisteme giremez ve bilgilerinin hatalı olduğu konusunda uyarılır. OK buttonuna basmamız ile de dialog sonlanacaktır.Çıkış yapılabilen bir dialog oluşturulduğu için Esc tuşuna basarak da bu uyarıyı geçebiliriz.

Ekran üzerinde bulunan Exit buttonu main activity nin sonlanmasını sağlayacaktır. Bunun için activity sınıfına ait olan finish() methodu kullanılır.

Signup buttonuna basmamız ile karşımıza bir dialog çıkacaktır. Bu dialog hazır bir dialog değildir. ‘signupdialog.xml’ layoutunu kullanarak yerleşimini ve parçacıkları oluşturur. Submit buttonu ile veriler veritabanına kayıt olurken discard ile dialogdan çıkılacaktır. Dialoglar oluşturulurken üç önemli nokta vardır. Birincisi dialoğun sahip olduğu Dialog_ID(dialog ile ilgili işlem yaparken kullanıldığından dolayı çok önemlidir.), ikinci onCreateDialog(dialoğun oluşum methodudur.) ve son olarak onPrepareDialog(dialoğun hazırlığı ve çalıştırılması.) Dialog oluşturulurken yada gösterime hazırlanırken bu call-methodlardan yararlanır. Ayrıca Bundle ile dialoğa veri taşımamızda mümkündür activitylerde olduğu gibi.


Diğer bir activitymiz olan MainPageForUser’ a bakalım.
Bir TabActivity’ dir. İçerisinde oluşturacağımız Tabları yönetir. ‘layout.xml’ i oluşturulurken dikkat edilmesi gerekir. Değişmez olarak ayarlanan id değerleri vardır. Sekmelerine intent sağlayarak onların yürütülmesi sağlamaktadır. Ayrıca onlara resim, başlık gibi verilerde sağlar. İkinci önemli nokta ise seçilen tab sekmesinin resminin değiştirilmesidir. Drawable içerisinde yazacağımız bir xml bilgisi ile bunu rahatlıkla yapabiliyoruz. Seçili iken gelen bir resmimiz ve seçili olmazken gelecek resmimizin tanımı yapıyoruz. Geri kalanını Android ayarlıyor.

Öğrenci için geçerli bir giriş yaptığımızda karşımıza ders bilgileri görüntüleniyor. Hangi dersi hangi öğretmen veriyormuş ve yüz üzerinden kaç almışız bunları görüntüleyebiliyoruz. Burada ki ekranın kırmızı yazıların altındaki bölüm tamamen dinamik bir şeklide java sınıfımız tarafından oluşturuluyor.

Geçerli öğretmen girişi de aşağıdaki  gibi bir ekran ile karşılanır. Öğrenci ekranında dinamik olan kısım burada da dinamikdir. Temel fark olarak ‘Edit’ buttonu görünüyor. Öğretmen istediği öğrencinin sınav notunu güncelleyebilir.

Bir önceki ekranda ‘Edit’  buttonuna basılması ile karşımıza bir dialog çıkmaktadır. Yeni not girilmedikten sonra activity reflesh yapılır. Yani ‘onCreate’ methodu tekrar çağırılır. Veri tabanı güncellendiğinden dolayı bilgiler güncellenecekdir.

Son olarak da öğrenci ve öğretmenin ikinci tab sekmesine bakalım, şifre ve kullanıcı adlarının güncellemesi sağlayan bir bölümdür.

Uygulamanın activityleri hakkında gerekli açıklamayı yaptıktan sonra artık database bölümüne geçelim.

Android uygulamalarında database olarak SQLite kullanıldığı söylemişdik. SQLite veritabanımızı bilgisayarımızda oluşturup telefonun içerisini kopyalarsak zaman kaybından ve kod karmaşıklığından kurtuluruz.(Fakat her uygulama için ideal olmayabilir.)Oluşturduğumuz veri tabanını eclipse üzerinde ADT plugin ile birlikte gelen android tools dan olan FileExplorer’ ı açıyoruz.(En az bir emülatör açık olmak zorunda.) Projemiz ‘/data/data/<paketismi>’ şeklinde konumlanıyor emülatörün içerisine. Proje dosyalarımız olarak ‘lib’ görünecekdir. ‘lib’ dizini yanına ‘databases’ dizini oluşturuyoruz. Bu dizin altınada veritabanımızı kopyalıyoruz.(.sqlite uzantısı olmayacak.) Ya da platform-tools içerisinden adb ile emülatöre bağlanıyoruz.(./adb -s emulator-<emulator no> shell şeklinde.) Ardındanda push ile istediğimiz konuma veritabanımızı gönderiyoruz.

Veritabanımızın tabloları ve içerisindeki kayıtları hazırladıktan sonra artık uygulamamızın içerisinde kullanabiliriz. Kullanmak için öncelikle ‘SQLiteOpenHelper’ subclass olarak kullanacak bir java sınıfı oluşturalım. Veritabanı ile ilgili temel işlemler sınıfımız tarafından yapılacaktır. Bizden bir yapılandırıcı ve iki tane de override fonksiyonu oluşturmamızı istiyor. Yapılandırıcı ile direk olarak veritabanına bağlantı oluşturur. Veritabanı mevcut değilse yeni bir ver tabanı oluşturur.’onCreate’ de veritabanı tabloları ve içeriği hazırlanır. ‘onUpgrade’ de veritabanının güncellenmesini sağlar.(Version numarasının değişimi ile bu method işletilir.) Artık sınıfımız bir SQLiteDatabase objesi üretebilir. Readable ve writable olmak üzere iki farklı formatta oluşturabilir.

Veritabanı sorgularında bize gerekli olanlar veritabanı ismi, tablo ismi, sütun isimleridir. (Sorguya göre ek veriler gelebilir.) Bu nedenle bir class oluşturup tüm bu verileri statik olarak tutarsak işimizi kolaylaştırırız. Verileri tutarken sütun ve tablo isimleri arasında da bir ilişki kurmamız gerekiyor. Aksi halde yapacağımız bir yanlış ile sql sorgu exceptionları alabiliriz. Kullanacağımız veri yapısı hem hızlı olmalıdır hemde doğru elemana ulaşım garantisi olmalıdır. En iyi seçim ‘map’ sınıfından türetilmiş bir yapıdır. ‘Map<Key,Value>’ key değeri olarak tablo ismi value değeri için ise sütunları tutan bir string array işimizi fazlasıyla kolaylaştıracaktır.

Veritabanımız ve gerekli veriler hazır artık sorgulara başlayabiliriz. Sorgu sınıfı veritabanı sınıfı ve veritabanı bilgilerini içeren sınıfın bir üst katmanı halinde oluşturup onlar ile iletişimini sağlayabilirsek. Gereksiz kalabalık sorgulardan kurtulup uygulama içerisinde birbirine benzeyen sorguları bir noktada toplayabiliriz. Bu sınıfımız temel olarak veritabanı bağlantı nesnesi üretebiliyor, SQLite vertabanı(readable ve writable seçenekleri mevcut) oluşturabiliyor, inset, select ve update gibi sql sorguları gerçekleyebiliyor. Bu şeklide uygulama katmanına, istenilen veriler farklı yerlerde aynı methodlar kullanılarak sağlayabiliyor.

Oluşturduğumuz data layer yukarıdaki gibi bir yapıdadır. Birlikte bu katmanı oluştururlar. Veritabanı işlemleri başka yerde yapılmaz. ‘QUERYMANAGER’ aynı zamanda iş katmanı olarak da görev yapar.

Ve uygulamamzın son bölümü olan Bundle…

Bundle activityler arasında veri transferine olanak sağlar. Çalışma prensipleride ‘Map’  veri yapılarına benzemektedir. Activity’ i çağırırken göndereceğimiz veri ile onun hazırlanmasını sağlayabilir. Mesela hangi kullanıcıya ait bilgileri görüntüleyeceğini göndereceğimiz veriler ile belirtiriz. Veriyi intent ile ortak kullanım havuzuna benzeyen bir bölüme aktarırız. Buradan ‘getIntent()’ ile intent oluşturur ‘getExtras()’ ile key değerini vererek veriyi alırız.

Key değerlerini tutan bir sınıf oluşturup bu sınıfa tüm sınıfların erişimini sağlayacak şekilde bir oluşum hazırlarsak. İstenilen veriyi temin etmede sorun yaşamayız.
Uygulama Sonuç

Android uygulamaramızda elimizde mevcut olan parçacıkları komplex olarak kullanıp görselliği ve kullanıcı kolaylığını arttırabiliriz. Ses, animasyon gibi bileşenleri eğer parçacıklarımıza uygun ölçüde adapte edebilirsek görmeye değer bir karışım çıkacaktır. Tabiki bunun için layoutların önemi çok büyüktür. Sayfa düzenimizi tasarladıktan sonra uygulamaya geçersek nerede neyin kullanılacağını daha iyi anlarız. Tabiki layoutların kendilerine has özelliklerinden yola çıkmalıyız.

Uygulamanın çalışma performansı çok önemlidir. Çünkü platform bir telefondur. Gereksiz yere CPU ve memory kullanımından kaçınılmalıdır. Uygulamalarımızdan istenilen verimi alamayabiliriz.

Uyulamanın ekran videosu…

Uygulamanın kaynak kodları..
İyi çalışmalar…

Yorum yapabilirsiniz..


Yazar : Nuri Sezgin

En son haber ve ücretsiz eğitimlere ulaşmak için üye olabilirsiniz