22 Kasım 2013 Cuma

Android - App Inventor Nedir?

Google, özel bir yazılım bilgisi gerektirmeden herkesin kolaylıkla Android mobil işletim sistemi için uygulama geliştirmesine olanak sağlayan App Inventor‘ı sınırlı sayıda kullanıcının kullanımına açtı. Yaklaşık 1 yıldır geliştirilmekte olan App Inventor için Google’ın öncelikli olarak hedeflediği kullanıcı kitlesi ise ortaokul ve lise çağındaki öğrenciler.
Bununla beraber uygulama geliştirmeyi son derece kolaylaştıran bu aracın diğer bir faydası ise Android’in açık ara geride kaldığı uygulama sayısı rekabetinde iPhone’a yetişebilmek için Google’a önemli bir fırsat sunuyor olması.
Karmaşık yazılım dilleri öğrenmeye geçmeden önce gençlerin yazılım algoritmalarını tanıma fırsatı sunması açısından oldukça faydalı olabilecek App Inventor ile ilgili en büyük eleştiri, bu uygulamanın çok fazla sayıda işe yaramaz uygulama üretilmesine yol açacağı ve App Marketi çöp uygulamalar cennetine çevireceği yönünde.
Diğer yandan Google’da App Inventor projesinde görev alan ve M.I.T.’de de araştırmalarını sürdüren bilim adamı Harold Abelson: “Amaç insanların bu mobil dünyada sadece tüketici değil, üretici de olabilmesini sağlamak” diyor. Bu açıdan bakıldığında insanların tam olarak kendi özel ihtiyaçlarını karşılayabilecek uygulamalar geliştirmesinin bu kadar basitleştirilmesi de önemli bir fırsat.
Örneğin App Inventor ile bir öğrencinin geliştirdiği uygulama etkinleştirildiğinde her 15 dakikada bir, özel bir listeye eklendiği cep telefonu numaralarına nerede olduğunu otomatik olarak mesaj atması sağlıyor. Böyle bir uygulamanın sadece birkaç dakika içerisinde geliştirilebilir olması, App Inventor’ın işleri ne kadar kolaylaştırdığının bir örneği.
Diğer bir uygulama ise bir hastanede görevli hemşire tarafından geliştirilmiş ve Android’li bir cep telefonu kullanan bir hastanın düştüğü anda otomatik olarak acil bir uyarı mesajının belirli kişilere gönderilmesini sağlıyor. Cihazın ivmeölçer özelliğinden faydalanan bu uygulama yine dakikalar içerisinde hazırlanabilmiş.
Ancak geliştirmek istediğiniz uygulama bu örneklerden daha karmaşıksaApp Inventor ile işiniz birkaç dakikada bitmeyebilir. Çünkü daha karmaşık uygulamalar geliştirmek için daha gelişmiş algoritmalar hazırlamak ve bunları uygulayacak ek bilgileri gerekebiliyor. Tech Crunch’ta App Inventor’ı inceleyen Jason Kincaid ortalama kullanıcıların bu aracı kullanmak için özellikle başlangıçta biraz zorlanabileceklerindenbahsediyor.
Hangi açıdan bakarsanız bakın App Inventor, mobil cihazlar açısından önemli bir uygulama. Faydaları mı yoksa dezavantajları mı daha öne çıkacak zaman içinde görebileceğiz, ama beklerken eğer siz de App Inventor’a bir göz atmak isterseniz şu adresten Gmail hesabınız ile giriş yaptıktan sonra size sunulan formu doldurabilirsiniz. App Inventor ekibi tarafından incelenecek olan başvuru sonrasında servisi kullanmaya hak kazanabilirsiniz. Kısa süre içinde servisin tüm kullanıcıların kullanımına açılacağını tahmin ediyoruz. App Inventor hakkında biraz daha detaylı bilgiyi ise şu adresten edinebilirsiniz. Buradan ise özel hazırlanmış bazı rehberlere ulaşmanız mümkün.

1 Kasım 2013 Cuma

Android Uygulaması (APK) Nedir? Android Uygulaması Nasıl Yüklenir

 Android işletimsistemli cihazlara yüklenen programların ve oyunların tamamı *.apk uzantılı olup anlamı yani uzantının açılımıapplication package file türkçesi uygulama yükleme paketi demektir. APK uzantılı bir dosyayı Winrar ile açabiliriz. Açtığımız zaman içinde java uygulamalarınınpaket sistemine benzeyen bir paket siste gibi hazırlanmış uygulama paketini görebiliriz.

APK uzantılı dosyaları winrar ile açtığımızda aşağıdaki klasörleri ve dosyaları göreceğiz:
  • META-INF klasörü:
    • MANIFEST.MF: Bİldiri dosyası
    • CERT.RSA: Uygulama sertifikası.
    • CERT.SF: Kaynakların listesi ve SHA-1 özeti ; Örneğin:


Signature-Version:1.0
Created-By:1.0(Android)
SHA1
-Digest-Manifest:wxqnEAI0UA5nO5QJ8CGMwjkGGWE=
...
Name:res/layout/exchange_component_back_bottom.xml
SHA1
-Digest: eACjMjESj7Zkf0cBFTZ0nqWrt7w=
...
Name: res/drawable-hdpi/icon.png
SHA1
-Digest:DGEqylP8W0n0iV/ZzBx3MW0WGCA=
  • lib: Bir işlemci yada yazılım katmanı için özgü derlenmiş kodları içerir, Birden fazla alt klasörü vardır bu alt klasörler:
    • armeabi: ARM tabanlı tüm işlemciler için derlenmiş
    • armeabi-v7a: ARMv7 ve üstü tabanlı tüm işlemciler için derlenmiş
    • x86: x86 tabanlı işlemciler için derlenmiş
    • mips: MIPS tabanlı işlemciler için derlenmiş
  • res: kaynakları içeren dizin resources.arsc içinde değilse (aşağıda).
  • AndroidManifest.xml: Ek Android bildirim dosyası olup içinde, uygulamanın adını, versiyonu, erişim bilgileri, lib dosyalarının kaynağını belirlen bilgiler yer almaktadır. Bu android XML dosyası herkes tarafından açılıp okunabilen düz XML metin haline dönüştürülebilir.
  • classes.dex: Dalvik sanal makinesi (Dalvik virtual machine) tarafından anlaşılabilir dex dosya biçiminde derlenmiş dosya
  • resources.arsc : Örneğin XML gibi derlenmiş kaynakların bulunduğu dosyadır.

APK uzantılı dosyaların ismini istediğimiz şekilde değiştirebiliriz sadece sonundaki uzantı *.apk olmalıdır. Bunun dışında sitenizde paylaşacağınız bir dosyanın ismini değiştirebilirsiniz. Kurarken kendisi uygulamanın ismi şeklinde kuracaktır.



Yani bir örnek vermek gerekirse:
Astro File Manager.apk dosyasının ismini dosya yoneticisi.apk olarak değiştirebilirsiniz. Bu uygulamayı bozmaz. Daha sonra değiştirdiğiniz dosyayı telefonunuza kurduğunuzda Astrol File Manager olarak kuracaktır. Peki bunun size avantajı ne diyecek olursanız. Özellikle bir mobil site sahibiyseniz, üyelerinize paylaştırırken uygulamaların ismini türkçe adıyla dağıtırsanız indiren kişi onun ne işe yaradığını hem bilecek hemde ileriye dönük cihazını formatlaması gerekirse tekrar kuracağında bu uygulama ne içindi demeyecek adını görünce hatırlayacaktır. Yada uygulamanın paylaşımının sizin sitenizden yapıldığını vurgulamak için uygulamanın ismini astro file manager mobildepo com.apk gibi değiştirerek paylaşımın sizin siteniz üzerinden yapıldığını vurgulamış olacaksınız. Böylece ilerde uygulamayı indiren kişi nerden indirdiğini hatırlayamazsa uygulamanın sonuna eklediğiniz site adresiniz sayesinde sitenize tekrar erişim yapmış olacak. Hem başka sitelerde de paylaşılmış olsa bile yine sizin sitenize girecektir.


Android Uygulaması Nasıl Yüklenir?
Android işletim sistemli cihazlara *.apk uzantılı dosyalar iki şekilde yüklenebilir. Birincisi Google Play üzerinden ikincisi Bilgisayarınıza yada telefonunuza indirerek yüklenebilir.
  • Google Play Android Market Üzerinden uygulama veya oyun yüklemek için bir adet Gmail hesabınızın olması yeterli.Mail adresi ve şifrenizlegiriş yaptığınız zaman market açılacak ve size tüm oyunları uygulamaları gösterecektir. Eğer Google üzerinden hesabınıza bir kredi kartı tanımlarsanız Google Play üzerinden ücretli uygulama ve oyunları da indirebilirsiniz. Tanımlama yapmazsanız indiremezsiniz.
  • İnternette paylaşım yapan Market dışındaki Forum ve sitelerden uygulama yüklemek için öncelikle telefonunuzun menüsünden Ayarlar kısmına giriyoruz oradan Uygulamalara giriyoruz. Burada Bilinmeyen Kaynaklar seçeneğini seçiyoruz. Seçince size bir uyarı gelecek evet diyorsunuz. Özellikle forumlarda yer alan kullanıcılar tarafından hazırlanmış uygulamaları temaları bu yolla yüklersiniz
  • Kısaca özetlersek Telefon Menüsüne tıklayıp ----> Ayarlar ----> Uygulamalar ----> Bilinmeyen Kaynakları işaretleyip çıkıyoruz.
  • Google Play'dan Astro File Manager Uygulamasının ücretsiz olanını telefonunuza kuruyorsunuz.
  • Şimdi forumlarda yerlan Android Uygulamaları ve Android Oyunları telefonunuza yada bilgisayarınıza indiriyoruz. Eğer bilgisayarınıza indirdiyseniz telefonunuzu data kablosu ile bilgisayarınıza bağlayın. Bağladığınızda bilgisayar telefonu harici disk gibi görecek. İndirdiğiniz uygulamayı yada oyunu Downloads klasörü içine atın. Eğer telefondan siteye girip indirirseniz oda aynı klasöre download yapacak. Özellikle XDA Developer sitesinde yer alan tamamiyle kullanıcılar tarafından geliştirilen birbirinden harika temaları bu yolla kurabilirsiniz.
  • Şimdi Google Play'dan indirdiğiniz Astro File Manager uygulamasını açın Download klasörü içine girin oradaki indirdiğiniz *.apk uzantılı uygulama yada oyununuza tıklayın ve install deyin.
  • Güle güle kullanın.

10 Ekim 2013 Perşembe

Android Dersleri 1 - [Service Kullanımı]

Android Servisleri

Servis nedir?

Servis, arka planda çalışan ve kullanıcıyla her hangi etkileşime girmeyen bir bileşendir.Bir servis kullanıcıya arayüzüne sahip olmadığı gibi bir activity’nin lifecycle’ına bağlı değildir.
Servisler veri kontrolu,intenet indirmeleri, veri işleme,içerik sağlayıcıları güncelleme gibi uzun vadede çalışan tekrarlı ve sürekli çalışmaya ihtiyaç duyan işlemler için kullanılır.
Servislerin görünmez halde olan ya da aktif halde olmayan activitylere nazaran önceliğe sahiptir.Bu sebeple Android işletim sisteminin bu işlemleri sonlandırması daha az görülür.
Ayrıca sistem kaynağı yetersizliğinde sonlandırılan bir servis tekrar başlatılması için yapılandırılabilir.
Bir servise arkaplanda çalışan bir activity ile aynı önceliği atamak da mümkündür.Bu gibi durumda,ilgili servis için görünür bir notification gereklidir.Bu durum da müzik player gibi uygulamalarda sık sık kullanılır.

Servisler ve Arkaplan İşlemleri

Bir servis ,uygulamanın Main Thread’inde aynı işlemde varsayılan olarak default olarak çalışır.Bu sebeple arkaplanda asenkronize işlem yapmak zorundasınız.Bir servis uygulamasında ortak kullanılan pattern; işlemleri başlatacak ve bitirecek bir Threadi servis içerisinde yaratıp çalıştırmaktır.

Platform Servisi ve Custom Servisler

Android platformu önceden tanımlanış servisleri çalıştırır ve bunları bize sunar.Ve her android uygulaması doğru izinler kullanarak bu servisleri kullanabilir.getSystemService() metodu ile bunlara ulaşılabilir.Bu servislere ulaşmak için Context sınıfı bir çok constant tanımlar.
Ayrıca Android platformu sizlere kendi custom servisinizi yazma olanağı da sağlar.

Custom Servis Tanımlama ve Başlatma

Custom servisler diğer Android bileşenlerinden başlatılırlar.(Activityler,Broadcast Receiverlar,Diğer servisler.)

Custom Servis Tanımlama

Uygulama ve tanımlama

Bir servis Manifest.xml dosyasında tanımlanmalıdır.Ve tanımlanacak sınıf Service sınıfından extend edilmelidir.
Aşağıdaki kodlar bir servis tanımlanmasının örneğini gösteriyor.


Bir Servisi Başlatmak

Bir servis bileşeni(Service,Receiver,Activity) startService(intent) metodu ile bir servisin faaliyete geçmesini tetikleyebilir.
Alternatif olarak bir servis bindService() metodu çağrılarak da başlatılabilir.Bu metod direk olarak servis ile iletişime geçmenize izin verir.Bu konuya daha sonra açıklı kgetireceğiz.
Eğer startService(intent) metodu çağrıldıysa ve servis henüz başlamadıysa, servis nesnesi yaratılır ve servisin onCreate() metodu çağrılır.startService(intent) metodu çağrıldığında intent nesnesini gönderir.
Servis çalışır haldeyken startService(intent) metodu çağrıldıysa, servisin onStartCommand() metodu çağrılır.
Bu yüzden onStartCommand() metodu bir kaç kere çağrılabilir,bu sebeple bu birkaç kere çağrılma işlemine karşı servis onStartCommand() metodunu hazırlaması gerekir.
Peki ya bu metod kodunuz içinde bir kaç kez çağrılırsa? Endişelenilmesi gerek bir durum oluşur mu ? Hayır.bu metod main thread’de android sistemi tarafından çağrılır.Bir servis sadece bir kez başlar istediğimiz kadar startService() metodunu çağırabiliriz.

Servisin Tekrar Başlatılması

onStartCommand() metodu çağrıldığında ir integer değer döndürür.Bu değer android platformu bu servisi sonlandırdığında kullanılacak değerdir.En çok kullanılan 3 tekrar başlatma seçeneği.

Service.START_STICKY :

Eğer servis sonlandırılırsa tekrar başlatılır.Kendi durumunu yöneten servisler için kullanılır.

Service.START_NOT_STICKY:

Servis tekrar başlatılmaz.Zaten periyodik olarak tetiklemeli servislerde kullanılır.

Service.START_REDELIVER_INTENT:

Service.Start_sticky ile çok benzerdir fakat orjinal intent onStartCommand metoduna tekrar iletilir.
Servisin başlayıp başlamadığını  Intent.getFlags() metodu ile kontrol edilebilir.

Servisi Durdurmak

Bir servisi stopService() metodu çağrılarak durdurabilirsiniz.Servisi kaç kere startService(intent) ile çağırmış olursanız olun, bir kere stopService() çağrıldığında servis durdurulur.
Bir servis stopSelf() metodu çağrılarak kendini durdurabilir.Genellikle bu servis işini bitirdiğinde kullanılır.

Servisleri Bağlama(Binding Services)

 Servislere Activitylerden Bağlanma

Bir activity servis ile iletişime geçmek istiyorsa , bindService() metodunu kullanarak servisi başlatabilir.
bindService() metodu parametre olarak ServiceConnection nesnesi alır.Servisin onBind() metodu ,ServiceConnection’a IBinder nesnesi döndürür.Bu IBinder nesnesi activity tarafından servis ile haberleşmede kullanılır.Daha sonra,Bağlama işlemi bittiğinde, servisteki onStartCommand() metodu çağrılır.

Local Servis Binding

Eğer servis activity ile aynı işlende çalışıyorsa, çalışılan activity’e servis objesini döndürmek mümkündür.Bu durum, activity’nin servisin içindeki metodları direlk olarak çağırmasına olanak sağlar.Bunun örneği  ileride incelenecektir.

Ayrı İşlemlerdeki Servisler(Services in seperate Processes)


Bir servisi kendi işleminde çalıştırma

Servisinizi ayrıca bireysel işlemlerde özelleştirebilirsiniz
android:process=”:process_description”
Burdaki isimden önce gelen iki nokta bize şunu söyler:”Bu servis tanımlandığı uygulama özel bir servistir.”.Eğer iki nokta olmasa idi bu servis global bir servis oluyordu ve bu servis diğer android uygulamaları tarafından kullanılabilirdi.
Servisi kendi process’i içerisinde çalıştırmak uzun çalışma operasyonları gerektiren servislerde uygulanın çalışmasını bloklamayacaktır.Fakat bir servis kendi process’inde çalışsa bile network işlemlerini asenkronize yapmak zorundadır çünkü Android Main Thread işlem sürecinde Network işlemlerine izin vermemektedir.

 Servislerle iletişim(Communication with Services)


İletişim Seçenekleri

Activitylerin servislerle ya da servislerin Activitylerle iletişim kurmasının bir çok yolu vardır.Bu bölümde bu olayı yaparken önerilen ve mümkün olanları tartışıp inceleyeceğiz.

Intent Verisi Kullanmak(Using Intent Data)

Basit bir senaryoyla anlatılmak istenirse,Servis başlatılan android bileşenincen bir intent verisi alır ve bunu işler.Herhangi bir bildirim gerekli değildir.Örnek olarak, bi servisin Content Provider’ı update etmesi verilebilir.Activity’e Content Provider tarafından haber verilir.Serviste extra bir adıma ihtiyaç yoktur.

Receiver Kullanmak(Using Receiver)

Ayrıca iletişim için yayın alıcılar(Broadcast Receivers) kullanılabilir.Servis bir broadcast yayınlar ve Activity içerisinde tanımlanmış Broadcast receiver bu broadcast’i alır,işler ve bir sonuç döndürür.
Bu iletişim şekli aşağıda şema ile gösterilmiştir.

Yerel servise Activity Bağlanması

Eğer bir servis Activity ile aynı işlemde başladıysa ,bu activity servise direk olarak bağlanabilir.Bu yol,servis ile activity arasında hızlı bir iletişim katmanı oluşturmak için en verimli ve basit yoldur.
Bu yerel servisler için çalışır.

Handler ve ResultReceiver veya Messenger

Eğer bir service activity ile geri iletişim kurması gerekiyorsa Servis aldığı intent data ile Messenger tipinde nesne kullanarak activity ile tekrar iletişim kurabilir.Eğer Messenger, activity içerisindeki Handler ile bağlanmışsa, Servis ,Message tipinde nesneyi activitye gönderebilir.
Messenger sınıfı başka bir işleme aktarılabilir.Yani bunu kullanarak Activity’deki Handler’a  mesajlar gönderebilirsiniz.
Messenger sınıfı ayrıyetten getBinder() Metodu ile Activity’e bir Messenger göndermeye izin verir.Bu nedenle Activity servise mesajlar gönderebilir.
Bu durum ise yerel ve kendi işleminde çalışan servislerde çalışır.

Servislerde daha fazlası…

Tek kullanımlıklar için IntentService

Servis sınıfınısı IntentService sınıfından extend ederek de bir servis sınıfı yaratabilirsiniz.IntentService sınıfı arkaplanda belirli görevleri uygulamak için kullanılır.Bir kere olur ve IntentService kend kendini sonlandırır.Buna örnek olarak Download işlemleri verilebilir.

Servis Kullanımı ve Servis iletişimi

Aşağıdaki örnek bir activityden butona tıklama ile internetten dosya indirme işlemini servis ile nasıl yapacağımızı gösterecek.İndirme işlemi tamamlandığında broadcast yayın yapacak ve broadcast receiver bu yayını alıp kullanıcıya indirme işlemi ile ilgili bilgileri verecek.
Bu alıştırmada IntentService sınıfı kullanılacak,çünkü bu sınıf arkaplan işlemlerini otomatik kendisi hallediyor.
Yeni bir proje oluşturun.
Ve servis için aşağıdaki class’ı oluşturun.
Bu oluşturduğumuz sınıfı AndroidManifest.xml de belirtmemiz gerekiyor.Ayrıca Manifestimizde external depolamaya yazma iznini ve internete erişim iznini istememiz gerekiyor.Sonuç olarak Manifest.xml Dosyası şu şekilde olması gerekiyor.
Activity’nizin Layout dosyası aşağıdaki gibi değiştirin.
ServiceTest sınıfımızı aşağıdaki gibi değiştirin.
Eğer örneği çalıştırıp indir butonuna basarsanız.İndirme işlemi Servis tarafından yapılacaktır.Tamamlandığında Kullanıcı arayüzü güncellenip Toast mesajı ile sizi bilgilendirecektir.
Şimdi projenin çalışma mantığına yakından bakalım.
Butona tıkladığımızda bir intent nesnesinin içine dosya ismini ve dosyanın URL’ini startService() metodu ile servise gönderiyoruz.Servis,onHandleIntent() metodunu çağırıyor ve bu gelen intentin içerisindeki dosya ismini ve URL bilgisini kullanılmak üzere değerlere atıyor.Ve dosyayı indirmeye başlıyor.İndirme işlemi tamamlandığında publishResults() metodu içerisinde sendBroadcast() methodu çağrılıyor.Bu broadcast yayını yapmamızın amacı servisimizin işini bitirdiğini ve bundan haberdar olmak isteyenler bu bilgileri alması gerektiğini söylemektir.
ServiceTest sınıfında oluşturulan BroadcastReceiver’ımızın  onReceive() metodu bundan haberdar oluyor ve bu gelen bilgileri bir Bundle referansına koyuyor ve handleResult() metodu çağrılıyor.HandleResult() metodunda ise indirme işleminin durumu kontrol edilip kullanıcı arayüzü güncelleniyor ve kullanıcıya son durum hakkında bilgi veriliyor.