Nedir: APK DOSYASI
1. Apk Dosyasının Oluşumu
Bir uygulama geliştirilidiğinde apk dosyalarının oluşması için birkaç yol izlemesi gerekir.Application modüle kısmında kaynak kodunuzu ve kaynak dosylarınızın bulunduğu kısımdır.Dependencies kısmı ise uygulamanız için gerekli olan kütüphanelerin bulunduğu yerdir.Bu kütüphaneler sayesinde uygulamanızın gelişimi sağlanır. Kaynak kodunuzun ve kütüphanelerin birleşmesiyle compilers yani derlenme işlemi gerçekleşir. Derlenen bu dosyanın içerisinden DEX File kodu çıkar. Ve oluşan kaynaklar APK Packager ile dosyanıza yerleştirirlir. Debug or Release Keystore ile gerekli imzalar, anahtarlar oluşturulur.Ve bu paketlenen dosya sayesinde bir apk dosyası oluşur. Bu oluşan apk dosyası store gibi yerlerden indirilir.
2. Apk Dosyasının İçeriği
Bir uygulama geliştirilirken önemli dosyalar bulunmaktadır. İlk olarak AndroidManifest dosyası vardır. AndroidManifest.xml dosyası, herhangi bir Android projesinin en önemli dosyalarından biridir. Uygulamanızın tüm temel bilgileri AndroidManifest.xml içinde gösterilir manifest: Dosyanın ana başlığıdır. Versiyon numaraları paket isimleri gibi temel özellikler manifest dosyasında bulunmaktadır. Eklenecek diğer başlıklar buraya eklenmelidir. Application taginini bulundurmak zorundadır.
Application: Uygulamaların değişkenlerini belirtmekte olduğumuz yerdir. Uygulamaların isimleri, ikonları , izinleri, bir takım ayarlar, kullanıcıların alan yönetimleri ve yedekleme gibi işlevleri application kısmında şekillendiriyoruz. resources.arsc: Kaynakların en ilk hallerini belirtir yani derlenmeden önceki hallerini saklamaktadır. uses-permission: Uygulamaların düzgün çalışması için kullanıcıların vermesi gereken sistem izinleridir.Bunlar kamera ,internet konum gibi izinlerdir.
permission: Uygulamaların genel özelliklerine erişimi için güvenlik izni şeklindedir. res: resources.arsc dosyasına düzenlememiş olan kaynakları tutmaktadır.
permission-tree: Bu kısımda ise izinlerin konumlanmasını yapmak için taban ismini belirtir.
classes.dex: Dalvik Sanal Makinesi ile iletişime geçebilen DEX dosyalarının formatını belirtir.
permission-group: İzinlerin mantıksal gruplandırılabilmesi için bir isim belirtmektedir.
instrumentation: Uygulamaların sistemle nasıl bir etkileşimde olduğunu izlememizi sağlayan sınıfı bildirir.Bu sınıfın nesnesi uygulamanın herhangi bir bileşeninden önce başlatılır ve uygulamayla ilgili test süreçlerini gerçekleştiren bir bileşendir.
uses-sdk:API servisini belirlemektedir.
assets: AssetManager ile çağırılabilir. Uygulama öğelerini tutmakla görevlidir.
uses-configuration: Uygulamanın gerektirdiği yazılım ve donanım özelliklerini belirtmektedir
2.1 İçerik sağlayıcılar
İçerik sağlayıcılar, bir uygulamanın kendi başına depolanan, diğer uygulamalar tarafından depolanan verilere erişimi yönetmesine yardımcı olabilir ve verileri diğer uygulamalarla paylaşmanın bir yolunu sağlayabilir. Verileri kapsarlar ve veri güvenliğini tanımlamak için mekanizmalar sağlarlar. İçerik sağlayıcılar, bir işlemdeki verileri başka bir işlemde çalışan koda bağlayan standart arabirimdir. Bir içerik sağlayıcı uygulamanın birçok avantajı vardır. En önemlisi, bir içerik sağlayıcısını, diğer uygulamaların uygulama verilerinize güvenli bir şekilde erişmesine ve şekil 1'de gösterildiği gibi değiştirmesine izin verecek şekilde yapılandırabilirsiniz.
Verileri paylaşmayı planlıyorsanız içerik sağlayıcıları kullanabilirsiniz. Verileri paylaşmayı planlamıyorsanız, yine de kullanabilirsiniz çünkü soyutlama sağlar, ancak verileri paylaşmak zorunda değilsiniz. Bu soyutlama, verilerinize erişime dayanan diğer mevcut uygulamaları etkilemeden uygulama veri depolama uygulamanızda istediğiniz değişiklikleri gerçekleştirmenize olanak sağlamaktadır. Bu kısımda, ona erişen uygulamalar değil, yalnızca içerik sağlayıcınız etkilenmektedir. Örneğin şekilde gösterildiği gibi, alternatif depolama için bir SQLite veri tabanını değiştirebilirsiniz.
Bir dizi başka sınıf, sınıfa güvenir.
ContentProvider
AbstractThreadedSyncAdapter
CursorAdapter
CursorLoader
Yukarıdaki sınıflardan herhangi birini kullanıyorsanız, uygulamanıza bir içerik saÄŸlayıcı da eklemeniz gerekmektedir. AÅŸağıdaki durumlardan birini yapmak istiyorsanız kendi içerik saÄŸlayıcınıza ihtiyacınız vardır: Uygulamanızda özel arama önerileri uygulamak istiyorsanız Uygulama verilerinizi widget’lara açmak için bir içerik saÄŸlayıcı kullanmanız gerekir.
Uygulamanızdan diğer uygulamalara karmaşık verileri veya dosyaları kopyalayıp yapıştırmak istiyorsanız içerik sağlayıcı kullanmalısınız. İçerik sağlayıcıların avantajları İçerik sağlayıcılar, verilere erişim izinleri üzerinde ayrıntılı olarak kontrol sağlamaktadırlar. Bir içerik sağlayıcıya erişimi yalnızca uygulamanızdan kısıtlamayı, başka uygulamalardan verilere erişim için genel olarak izin vermeyi veya veri okumak ve yazmak için farklı izinler yapılandırmayı seçebilirsiniz. Uygulamanızdaki farklı veri kaynaklarına erişim ayrıntılarını ayırmak için bir içerik sağlayıcı kullanabilirsiniz.
Mesela uygulamanız biçimlendirilmiş kayıtları bir SQLite veri tabanının dışında ses ve video dosyalarını da depolayabilmektedir. Eğer uygulamanızda bu geliştirme modelini kullanırsanız oluşan tüm verilere bir içerik sağlayıcı kullanabilirsiniz.Arka planda verileri yüklemek için CursorLoader kullanabilirsiniz.
2.2. Aktivite
public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, View.OnCreateContextMenuListener, ComponentCallbacks2
java.lang.Object
android.content.Context
android.content.ContextWrapper
android.view.ContextThemeWrapper
android.app.Activity
Bilinen doğrudan alt sınıflar
• AccountAuthenticatorActivity
• ActivityGroup
• AliasActivity
• ExpandableListActivity
• ListActivity
• NativeActivity
Bilinen dolaylı alt sınıflar
LauncherActivity
PreferenceActivity
TabActivity Aktivite, kullanıcının yapabileceği odak noktalarından bir tanesidir. setContentView(View):Burada bulunan tüm etkinlikler kullanıcıyla etkileşime girmektedir, bu nedenle Activity sınıfı sizin için kullanıcı ara yüzünüzü yerleştirebileceğiniz bir pencere oluşturmaya özen gösterir. Aktiviteler genellikle kullanıcıya tam ekran pencereler olarak sunulsa da, kayan pencereler ve çoklu pencere modu veya gömülü pencereler şeklide de kullanıcılara sunulabiliyor. onCreate(Bundle) işlemlerinizi başlattığınız kısımdır. Bu kısımda en önemli detaylardan biri, genellikle setContentView(int) kullanıcı ara yüzünüzü tanımlayan bir düzen tabanı ile uyarı yapacaksınız ve findViewById(int) bu kullanıcı ara yüzünde programlı olarak etkileşimde bulunmanız gereken pencere öğelerini almak için kullanacaksınız. onPause():Kullanıcının işlemlerde aktif etkileşimi duraklatılmasıyla ilgilenilen kısımdır. Contentprovider verilerini tutmak için genellikle kullanıcı tarafından yapılan herhangi bir değişiklik bu noktada yapılmalıdır. Çünkü bu işlem gerçekleştiğinde aktivite işlemi ekranda görünüyor olabilir.
Ele alınan konular:
1. Parça
2. Etkinlik Yaşam Döngüsü
3. Yapılandırma Değişiklikleri
4. Faaliyetlere Başlama ve Sonuçları Alma
5. Kalıcı Durumu Kaydetme
6. Ä°zinler
7. Süreç Yaşam Döngüsü
2.3. Parça
Alt FragmentActivity sınıfından, Fragment kodlarını daha iyi modülleştirmek uygulamalarının küçük ve büyük ekranlar arasında ölçeklenmesine yardımcı olmak için ve daha büyük ekranlar için daha sofistike kullanıcı ara yüzleri oluşturmak amaçlı bu sınıftan yararlanabilmektedir.
2.4. Etkinlik Yaşam Döngüsü
Sistemdeki aktiviteler , aktivite yığınları olarak yönetilmektedir . Yeni bir etkinlik başlatıldığında, genelde mevcut olan yığının üstüne yerleştirilmektedir ve böylece devam eden etkinlik haline gelir. Daha önce yapılan etkinlik yığında en alttadır ve yeni bir etkinlik oluşana kadar ön plana gelmemesi sağlanır. Ekranda görülebilen bir veya daha fazla etkinlik yığını olabilir. Bir faaliyetin esasen dört durumu vardır: Bir etkinlik ekranın ön planındaysa yani en üst yığının en yüksek konumunda ise, etkin veya çalışıyor demektir . Bu genellikle kullanıcının şu anda etkileşimde olduğu etkinlik anlamına gelmektedir. Bir etkinlik odak noktası olmakta çıkmışsa yine de kullanıcıya hizmet veriyorsa sistemde görülebilir. Yeni tam boyut olarak kullanılmayan uygulamaların diğer etkinliğinizin üstüne odaklanması sonucunda geçerli pencere modunda ki uygulamaya odaklanamaması mümkündür. Bir etkinlik, başka bir etkinlik tarafından tamamen durdurulur veya engellenirse sistem tarafından kullanıcıya ait olan bilgileri saklar ama bu kullanıcı tarafından görülmez çünkü pencere gizli haldedir. Eğer bellek ihtiyacında olursa sistem tarafından engellenir. Sistem, aktiviteyi bitirmesini isteyerek ya da sadece sürecini engelleyerek hafızadan çıkarabilir. Kullanıcıya tekrar görüntülendiğinde ise tamamen yeniden başlatılmalı ve önceki durumuna geri yüklenmelidir. Aşağıdaki şekilde, bir faaliyetin önemli durum yollarını göstermektedir. Dikdörtgenler, Activity durumlar arasında işlem gösterdiğinde gerekli işlemleri gerçekleştirmek için uygulayabileceğiniz geri uyarı yöntemlerini temsil etmektedir. Renkli ovaller ise aktivitenin içinde olabileceği başlıca durumları kast etmektedir.
Faaliyetleri izlemek için 3 temel döngü bulunmaktadır bunlar:
Tüm kullanım süresi : Bir etkinliÄŸin ilk çaÄŸrı arasında olur. Bir etkinlik, onCreate () içindeki tüm “küresel” durum kurulumunu gerçekleÅŸtirecek ve onDestroy () içinde kalan bütün kaynakları serbest olarak bırakacaktır. Örnek olarakbelirli bir aÄŸdan veri indirmek için arka planda çalışan bir iÅŸ parçacığı bulunuyorsa, bu iÅŸ parçacığını onCreate () içinde oluÅŸturabilir ve sonrasında onDestroy () yardımıyla içinde bulunan iÅŸ parçacığını durdurabilmektedir.
Görünür süresi bir etkinliğin bir çağrı arasında olur onStart()ve onStop().yapılana kadar kullanıcıyla etkileşim halinde olmasa bile ekranda etkinliği görüntüleyebilir. Kullanıcıya bu etkileşimleri göstermek istenirse bu yöntemle korunabilir. Örneğin, BroadcastReceiver kullanıcı arayüzünüzü etkileyen değişimleri gözlemlemek için bir onStart () kaydı yapabilir ve kullanıcı görüntülediğiniz şeyi artık görmediğinde onStop () kaydını iptal edebilirsiniz. OnStart () ve onStop () yöntemleri, etkinlik görünür hale geldiğinde ve kullanıcı tarafından saklandığında birden fazla çağrılabilmektedir.
Ön süresi onResume()cevap olarak gelen bir çağrı yapılana kadar onPause()arasında geçen çağrıda olur. Bu süre zarfında etkinlik görünür haldedir ve kullanıcıyla iletişim halindedir.
Hizmet nedir?
Aksi bir durum olmadıkça parçası olduğu uygulama ile aynı süreçte çalışmaktadır. Hizmeti ayrı bir süreç olarak göremeyiz. Sadece nesnenin kendisi ile çalıştığı süreçte görev almaktadır. Hizmet uygulama yanıt vermiyor hatalarını önlemek için çalışmaktadır. Bir Hizmet bileşeni oluşturulduğunda bu nedenlerden herhangi biri için, sistemin gerçekte yaptığı tek şey bileşeni somutlaştırmak onCreate() ve temel iş parçacığındaki yerini ve diğer uygun geri çağrıları istetmelidir. İkincil bir iş parçacığı oluşturmak hizmet sistemine kalmıştır.
Hizmet Yaşam Döngüsü
Bir hizmetin sistem tarafından çalıştırılmasının iki nedeni vardır. Context. startService()herhangi biri ararsa sistem hizmeti alır yani onCreate()gerekirse onu oluÅŸturur ve yöntemini çağırabilir ve ardından onStartCommand(Intent, int, int)istemci tarafından saÄŸlanan argümanlarla iÅŸlemini çağırabilir. Servis bu noktada Context. stopService()veya stopSelf()çaÄŸrılıncaya kadar iÅŸlemini sürdürmeye çalışacaktır. Context. startService () ‘e yapılan birden fazla çaÄŸrı toplanmaz bu yüzden Context. stopService () veya stopSelf bir kez bir hizmetin kaç kez baÅŸlatıldığına bakılmaksızın çaÄŸrıları durduracaktır. Fakat hizmetler, stopSelf(int)baÅŸlatılan amaçlar iÅŸlenene kadar hizmetin durdurulmamasını saÄŸlamak için kendi bulduÄŸu iÅŸlemleri kullanabilir.
Ä°zinler
Bir hizmete erişim, bildiriminin <service> etiketi altında belirtildiğinde o hizmete erişim zorunlu kılınabilir. Bunu yaparak, diğer uygulamaların <uses-permission> hizmeti başlatabilmesi, durdurabilmesi veya hizmete bağlanabilmesi için kendi bildirimlerinde karşılık gelen bir öğeyi tanımlamaları gerekecektir. Hizmet, ContextWrapper.checkCallingPermission(String) gibi bahsi geçen aramanın işlemini gerçekleştirmeden önce kendisine gelen özel IPC çağrılarını izinlerle koruyabilmektedir.
Süreç Yaşam Döngüsü
Android sistemi, işlem başlatıldığında veya istemcilerin buna bağlı olduğu sürece bir hizmeti bulundurma sürecini sürdürmeye çalışacaktır. Bellek yetersiz bir şekilde çalışırken ve mevcut işlemleri bitirmek gerektiğinde, hizmeti barındıran bir işlemin önceliği süreç yaşam döngüsü olacaktır. Hizmetle aynı anda çalışan diğer uygulama bileşenleri ilk olarak genel sürecin önemi arttırmaktadır.
2.4. Broadbcast receiver
public abstract class BroadcastReceiver
extends Object
java.lang.Object
android.content.BroadcastReceiver
Bilinen doğrudan alt sınıflar
AppWidgetProvider
DelegatedAdminReceiver
DeviceAdminReceiver
MbmsDownloadReceiver
PackageChangeReceiver
RestrictionsReceiver
Broadcast kullanıcıya bildiri şeklinde görünürler. Diğer uygulamalar için bir köprü görevini üstlenmektedir. Örneğin bir uygulamanın düşük pil uyarış aldığında ona göre hareket etmesi gibi. Yayınların geneli sistem tarafından organize edilmektedir. Context. sendBroadcast(Intent):Gönderen yayınların amaçlarını alan ve işleyen kod için bir temel sınıfı belirtmektedir.
İç içe geçmiş sınıflar
Class BroadcastReceiver. PendingResult
Broadcast için bekleyen bir sonucun durumu hakkında bilgi vermektedir.
Genel yöntemler
Final void abortBroadcast()
Mevcut yayını durdurması gerektiğini belirten bayrakları ayarlamaktadır. Context#sendOrderedBroadcast(Intent, String) yayını sadece üzerinden gönderilen yayınlar yardımıyla çalışmaktadır. Bu alıcının mevcut yayını durdurması gerektiğini belirten bayrağı ayarlar; yalnızca üzerinden gönderilen yayınlarla çalışır.
Final void clearAbortBroadcast()
Bu alıcının geçerli olan yayını sonlandırması gerektiğini belirten bayrağı temizlemekle sorumludur.
Final boolean getAbortBroadcast()
Bu alıcının mevcut olan yayını iptal edip etmeyeceğini belirten bayrağı döndürmektedir.
Final int getResultCode()
Geçerli sonuç kodunu önceki alıcı tarafından alınan kısımdır.
Final String getResultData()
Önceki alıcı tarafından ayarlanan biçimde geçerli sonuçta oluşan verileri almaya yardımcı olur.
Final Bundle getResultExtras(boolean makeMap)
Alıcı tarafından oluşturulan ek verileri almaya yardımcı olur.
Final BroadcastReceiver.PendingResult goAsync()
onReceive(Context, Intent) işlevini tamamladıktan sonra uygulama tarafından yayını aktif tutmak ve izin vermek için çağrılabilir. Final boolean isOrderedBroadcast() Alıcı tarafından sıralı bir yayın işleniyorsa bunu döndürür.
abstract void onReceive(Context context ,Intent intent)
BroadcastReceiver yani yayın alıcı bir amaç yayını aldığında döndürülmektedir.
IBinder peekService(Context myContext, Intent service)
Zaten mevcut olan bağlı bir hizmete bağlayıcı eklemeye yarar.
Final void setDebugUnregister(boolean debug) Context#registerReceiver(BroadcastReceiver, IntentFilter) ile uyumsuz çağrılar için hata ayıklama yardımının dâhil edilmesini sağlayan kısımdır.
Final void setOrderedHint(boolean isOrdered)
Dâhili kullanım için, broadcast sıralı bir şekilde çalışıp çalışmadığına dair bilgiler vermektedir.
2.5. Amaç
public class Intent extends Object implements Parcelable, Cloneable
java.lang.Object
android.content.Intent
Bilinen doğrudan alt sınıflar
-LabeledIntent
Amaç gerçekleştirilecek bir işlemin soyut olarak açıklanmasını ifade etmektedir. Farklı uygulamalardaki kod arasında geç çalışma zamanı bağlama işlemi gerçekleştirmek için bir işletme sağlar. En mühim kullanımı, çalışma arası sistemleri birleştirmesi olarak düşünülebilecek faaliyetlerin başlatılmasıdır. Başlıca, uygulanabilecek bir olayın özet bir tanımını tutan pasif bir veri birleşimidir.
Amaç Yapısı
Bir amaçtaki birincil bilgi parçaları şunlardır:
Eylem :ACTION_VIEW, ACTION_EDIT, ACTION_MAIN gibi yapılması gereken genel bir aksiyondur
Data:Kişiler veri tabanındaki bir şahıs kaydı gibi üzerinde işlem düzenleyebilecek verilerdir. 17
Bazı eylem / veri çifti örnekleri şunlardır:
ACTION_VIEW content: // kiÅŸiler / kiÅŸiler / 1 — Tanımlayıcısı “1” olan kiÅŸi hakkındaki bilgileri görüntülemek için kullanılmaktadır.
ACTION_DIAL content: // kiÅŸiler / kiÅŸiler / 1 — DoldurulmuÅŸ kiÅŸi ile telefon çeviriciyi görüntülemek için kullanılır.
ACTION_VIEW tel: 123 — Girilen numara ile telefon çeviriciyi görüntülemeye yarar. Görünüm eyleminin belirli bir
URI için en mantıklı olanı nasıl yaptığına dikkat edilmesi gerekmektedir.
ACTION_DIAL tel: 123 — Verilen numara depolanmış olarak telefon çeviriciyi görüntülemeye yarar.
Bu birincil özniteliklere ek olarak, bir amaçla dâhil edebileceğiniz birkaç ikincil öznitelik vardır:
Kategori: Yürütülecek hareket hakkında ek olarak bilgiler vermektedir. .
Tür: Amaç verilerinin açık bir örneğini (bir MIME türü) belirtmektedir. Normalde tür, verilerin kendisinde taşıdığından dolayı verileri kendinden çıkartmaktadır. Bu özniteliği ayarlayarak, bu değerlendirmeyi devre dışı bırakır ve açık bir türü açmayı zorlayabilirsiniz.
Component: Amaç için kullanılacak bir bileşen bloğunun açık bir ismini göstermektedir. Normalde bu, amaçtaki diğer bilgilere (eylem, veri / tür ve kategoriler) bakılarak ve bunu idare edebilecek bir bileşenle eşleştirilerek belirlenir.
Ekstralar :Bu, bileşene büyütmek ve bilgi sağlamak için kullanılabilir. Örneğin, bir e-postayı iletmek için bir
işlemimiz varsa, buraya bir konu, gövde vb. eklemek için fazladan veri parçaları da eklenebilmektedir.
Intent sınıfında belirlenmiş çeşitli standart Intent hareketi ve kategori sabitleri vardır, ancak uygulamalar kendi
değerlerini de tanımlayabilir. Uygulamalar sisteme eklendikçe, yeni eylemler, türler ve kategoriler ekleyerek bu dili
genişletebilirler veya bunları işleyen kendi etkinliklerini sağlayarak mevcut cümlelerin davranışını değiştirebilirler.
Amaç Çözümü
Kullanacağınız iki temel amaç biçimi vardır.
Açık Amaçlar , çalıştırılacak tam sınıfı sağlayan bir bileşen şeklinde gösterilmektedir. Genellikle bunlar, bir uygulamanın, kullanıcı uygulamayla iletişime geçerken sahip olduğu farklı etkinlikleri başlatmasıyla bilindiği için herhangi bir veri içermemektedir.
Örtük Amaçlar sahip olunan bileşenlerden hangisinin o amaç için en iyi düzeyde çalıştırılacağını belirlemesi için sisteme yeterli bilgi vermesidir.
2.6. Ä°ntent Aktivasyonu
Bileşenleri birbirine bağlayan bir gruptur. Servis, broadcast ve aktivite ile eş zamanlı bir şekilde çalışmayan mesajlar tarafından çalışır hale getirir. Intentler, uygulama çalışırken, bağımsız bileşenleri birbirine bağlar. Bu bileşen uygulama bünyesinde de barınabilir , başka uygulamaların bileşenlerinde de bulunabilir. Bu dosyalar xml formatında oluşturulduğu için hem insanlar hem de makineler tarafından okunabilir bir haldedir.
Kaynakça
AndroidDev (2020). Activity
AndroidDev (2020). BroadcastReceiver
AndroidDev (2020). Intent