Android hizmetleri oluşturma

Bu kılavuzda, etkin bir kullanıcı arabirimi olmadan çalışmanın yapılmasına izin veren Android bileşenleri olan Xamarin. Android Hizmetleri açıklanmaktadır. Hizmetler, arka planda gerçekleştirilen, zaman alan hesaplamalar, dosya indirme, müzik yürütme vb. gibi görevler için çok yaygın olarak kullanılır. Hizmetlerin için uygun olduğu farklı senaryolar açıklanmakta ve ayrıca, uzun süre çalışan arka plan görevlerinin ve uzak yordam çağrılarına yönelik bir arabirim sağlamak için bunların nasıl uygulanacağı gösterilmektedir.

Android hizmetlerine genel bakış

Mobil uygulamalar, masaüstü uygulamaları gibi değildir. Masaüstü bilgisayarlar, ekran Emlak, bellek, depolama alanı ve bağlı güç kaynağı gibi değerli miktarda kaynağa sahiptir, mobil cihazlar değildir. Bu kısıtlamalar, mobil uygulamaların farklı davranmasını zorlar. Örneğin, bir mobil cihazdaki küçük ekran genellikle tek bir uygulamanın (yani etkinlik) aynı anda görünebileceği anlamına gelir. Diğer etkinlikler arka plana taşınır ve herhangi bir çalışmayı gerçekleştiremeyecek olan askıya alınmış bir duruma gönderilir. Ancak, bir Android uygulaması arka planda olduğundan, uygulamanın çalışmaya devam etmesini olanaksız hale gelmediği anlamına gelmez.

Android Uygulamaları aşağıdaki dört birincil bileşenden en az birini yaptı: Etkinlikler, yayın alıcıları, içerik sağlayıcılarıve Hizmetler. Etkinlikler, bir kullanıcının uygulamayla etkileşime geçmesini sağlayan Kullanıcı ARABIRIMINI sağladığından birçok harika Android uygulamanın temel taşıdır. Ancak, eş zamanlı veya arka plan işi gerçekleştirmek için etkinlik her zaman en iyi seçenektir.

Android 'de arka plan çalışması için birincil mekanizma hizmettir. Android hizmeti, Kullanıcı arabirimi olmadan bazı işler yapmak için tasarlanan bir bileşendir. Bir hizmet bir dosya indirebilir, müzik oynayabilir veya bir görüntüye filtre uygulayabilir. Hizmetler Ayrıca, Android uygulamaları arasında işlemler arası iletişim (IPC) için de kullanılabilir. Örneğin, bir Android uygulaması başka bir uygulamadan veya bir uygulama, bir hizmet aracılığıyla diğer uygulamalara veri (kişinin kişi bilgileri gibi) sunabilir.

Hizmetler ve arka plan çalışması gerçekleştirme yeteneği, sorunsuz ve akışkan bir kullanıcı arabirimi sağlamak için önemlidir. Tüm Android uygulamalarının, etkinliklerin çalıştırıldığı ana iş parçacığı ( UI iş parçacığıolarak da bilinir) vardır. Cihazın yanıt vermesini sağlamak için, Android 'in, saniye başına 60 kare hızında Kullanıcı arabirimini güncelleştirebilmesi gerekir. Bir Android uygulaması ana iş parçacığı üzerinde çok fazla iş gerçekleştiriyorsa, Android çerçeveleri bırakabilir ve bu da Kullanıcı arabiriminin düzensiz görünmesine neden olur (bazen de yine de alınabilir olarak adlandırılır). Bu, UI iş parçacığında gerçekleştirilen tüm çalışmanın iki kare arasındaki zaman aralığında (yaklaşık 16 milisaniye) (her 60 karede 1 saniye) tamamlanmasıdır.

Bu sorunu gidermek için, bir geliştirici bir etkinlikte iş parçacıklarını kullanarak Kullanıcı arabirimini engelleyecek bazı işler gerçekleştirebilir. Ancak, bu sorun ortaya çıkabilir. Android 'in, etkinliğin birden çok örneğini yok etme ve yeniden oluşturma işlemi oldukça olasıdır. Ancak, Android iş parçacıklarını otomatik olarak yok etmez ve bu da bellek sızıntılarına neden olabilir. Bu, cihazın döndürüldüğü bir örneğidir. Android etkinliğin örneğini yok etmek ve sonra yeni bir tane oluşturmak için yeniden oluşturma işlemi yapmayı dener:

Cihaz döndürülerek, örnek 1 yok edilir ve örnek 2 oluşturulur

Bu potansiyel bir bellek sızıntısı: etkinliğin ilk örneği tarafından oluşturulan iş parçacığı çalışmaya devam edecektir. İş parçacığının etkinliğin ilk örneğine bir başvurusu varsa, bu, Android 'in nesneyi atık olarak toplamasını önler. Ancak etkinliğin ikinci örneği yine de oluşturulur (Bu, sırasıyla yeni bir iş parçacığı oluşturabilir). Cihazı hızlı bir şekilde art arda döndürmek, tüm RAM 'i tüketebilir ve Android 'in belleği geri kazanmak için tüm uygulamayı sonlandırmayı zorlayacaktır.

Bir Thumb kuralı olarak, gerçekleştirilecek iş bir etkinliği daha fazla yaşalıyorsa, bu işi gerçekleştirmek için bir hizmetin oluşturulması gerekir. Ancak, iş yalnızca bir etkinliğin bağlamında geçerliyse, çalışmayı gerçekleştirmek için bir iş parçacığı oluşturmak daha uygun olabilir. Örneğin, Fotoğraf Galerisi uygulamasına yeni eklenen bir fotoğrafın küçük resminin oluşturulması muhtemelen bir hizmette gerçekleşmelidir. Ancak, bir iş parçacığı yalnızca bir etkinlik ön planda olduğunda duyulmuş olması gereken bazı müzikleri çalmak için daha uygun olabilir.

Arka plan çalışması, iki Geniş sınıflandırmalara ayrılabilir:

  1. Uzun süre çalışan görev – bu, açıkça durduruluncaya kadar devam eden bir çalışmadır. Uzun süre çalışan bir görev örneği, bir sensörden toplanan verileri izlemek zorunda olan veya müzik akışı yapan bir uygulamadır. Uygulama görünür Kullanıcı arabirimine sahip olmasa da bu görevler çalıştırılmalıdır.
  2. Düzenli görevler – (bazen olarak adlandırılır) düzenli bir görevin süresi nispeten kısa bir süredir (birkaç saniye) ve bir zamanlamaya göre (örneğin, bir haftada bir veya sonraki 60 saniye içinde bir kez) çalıştırılır. Bunun bir örneği, Internet 'ten bir dosya indirmede veya bir görüntü için küçük resim oluşturmaktan oluşur.

Dört farklı Android hizmeti türü vardır:

  • Bağlantılı hizmet – bir bağlantılı hizmet , kendisine bağlanan başka bir bileşene (genellikle bir etkinlik) sahip bir hizmettir. Bir ilişkili hizmet, ilişkili bileşenin ve hizmetin birbirleriyle etkileşime geçmesini sağlayan bir arabirim sağlar. Hizmete daha fazla istemci bağlanmazsa, Android servisi kapatır.

  • IntentService – Bir IntentServiceService sınıfının, hizmet oluşturma ve kullanımını kolaylaştıran özelleşmiş bir alt sınıfıdır. IntentService, Tek tek otonom çağrıları işlemek için tasarlanmıştır. Birden çok çağrısı eşzamanlı olarak işleyebilen bir hizmetin aksine, bir IntentServiceIntentService gibi daha fazla işlem yapılır ve IntentService her iş, tek bir çalışan iş parçacığı üzerinde her seferinde bir işlenir. Genellikle, bir IntentService etkinliğe veya parçaya bağlanmamış olur.

  • Hizmet başlatıldı : başlatılmış bir hizmet , başka bir Android bileşeni tarafından başlatılan bir hizmettir (örneğin, bir etkinlik) ve hizmetin durmasına açık bir şekilde söylene kadar arka planda sürekli çalıştırılır. Bir ilişkili hizmetten farklı olarak, başlatılmış bir hizmette doğrudan kendisine bağlantılı istemciler bulunmaz. Bu nedenle, başlatılan hizmetlerin gerektiğinde düzgün şekilde yeniden başlatılabilmeleri için tasarlamak önemlidir.

  • Karma hizmetkarma hizmet , başlatılmış bir hizmetin özelliklerine ve bir bağlanan hizmetesahip olan bir hizmettir. Bir karma hizmet, bir bileşen kendisine bağlandığında veya bazı bir olay tarafından başlatılabilirler. İstemci bileşeni karma hizmete bağlanabilir veya olmayabilir. Karma hizmeti, açıkça durduruluncaya veya kendisine bağlanana kadar başka istemci kalmayana kadar çalışmaya devam eder.

Kullanılacak hizmet türü, uygulama gereksinimlerine çok bağlıdır. Bir parmak kuralı olarak, bir IntentService veya bir bağlantılı hizmet, bir Android uygulamasının gerçekleştirmesi gereken birçok görev için yeterlidir. bu nedenle, bu iki hizmet türünden birine tercih verilmelidir. Bir IntentService dosya indirme gibi "tek çizgili" görevler için iyi bir seçimdir, ancak bir etkinlik/parça ile sık kullanılan etkileşimler gerektiğinde bir ilişkili hizmet uygun olur.

Çoğu hizmet arka planda çalıştığı sürece, ön plan hizmetiolarak bilinen özel bir alt kategori vardır. Bu, Kullanıcı için bazı işler (örneğin, müzik oynama) gerçekleştirmek üzere daha yüksek öncelikli (normal bir hizmetle karşılaştırıldığında) verilen bir hizmettir.

Ayrıca, aynı cihazdaki bir hizmeti kendi sürecinde çalıştırmak mümkündür. Bu, bazen uzak hizmet olarak veya işlem dışı bir hizmetolarak adlandırılır. Bu, oluşturmak için daha fazla çaba gerektirir, ancak bir uygulamanın diğer uygulamalarla işlevselliği paylaşması gerektiğinde ve bazı durumlarda bir uygulamanın kullanıcı deneyimini iyileştirebilmek için yararlı olabilir.

Android 8,0 'de arka plan yürütme sınırları

Android 8,0 ' den başlayarak (API düzeyi 26), bir Android uygulamasının artık arka planda serbestçe çalışma yeteneği yoktur. Ön planda bir uygulama, Hizmetleri kısıtlama olmadan başlatabilir ve çalıştırabilir. Bir uygulama arka plana taşınırsa, Android uygulamayı başlatmak ve hizmetleri kullanmak için belirli bir süre sağlar. Bu süre geçtiğinde, uygulama artık herhangi bir hizmeti başlatamaz ve başlatılan hizmetlerin sonlandırılması sonlandırılır. Bu noktada, uygulamanın herhangi bir işi gerçekleştirmesi mümkün değildir. Aşağıdaki koşullardan biri karşılandığında, Android bir uygulamayı ön planda olacak şekilde kabul eder:

  • Görünür bir etkinlik (başlatılmış veya duraklatılmış) vardır.
  • Uygulama bir ön plan hizmeti başlattı.
  • Başka bir uygulama ön planda bulunur ve bir uygulamadan, aksi halde arka planda olacak bileşenler kullanılıyor. Bunun bir örneği, ön planda olan uygulama A 'nın, B uygulaması tarafından sunulan bir hizmete bağlandığı bir örneğidir. Ayrıca, B uygulaması ön planda değerlendirilir ve arka planda olması için Android tarafından sonlandırılmaz.

Bir uygulama arka planda olsa da, Android uygulamayı uyandırır ve birkaç dakika boyunca bu kısıtlamaları, uygulamanın biraz iş gerçekleştirmesini sağlar:

  • Uygulama tarafından yüksek öncelikli bir Firebase bulut Iletisi alındı.
  • Uygulama bir yayın alır.
  • Uygulama bir PendingIntent bildirime yanıt olarak alır ve yürütür.

Mevcut Xamarin. Android uygulamalarının, Android 8,0 ' de oluşabilecek sorunlardan kaçınmak için arka plan çalışmalarını nasıl gerçekleştirdikleri üzerinde değişiklik yapması gerekebilir. Android hizmetine yönelik bazı pratik alternatifler aşağıda verilmiştir:

  • Android Iş Zamanlayıcısı 'nı veya Firebase iş dağıtıcısını kullanarak arka planda çalışacak işi zamanlayın : Bu iki kitaplık, uygulamaların arka plan işlerini farklıbir iş birimi olarak ayırmak için bir çerçeve sağlar. Uygulamalar daha sonra iş ne zaman çalıştırılacağı hakkında bazı ölçütlerle birlikte işi işletim sistemiyle zamanlayabilir.
  • Hizmeti ön planda Başlat – bir ön plan hizmeti, uygulamanın arka planda bazı görevleri gerçekleştirmesi gerektiğinde ve kullanıcının bu görevle düzenli olarak etkileşimde bulunması gerekebileceği için yararlıdır. Ön plan hizmeti, kullanıcının uygulamanın bir arka plan görevi çalıştığını ve ayrıca görevi izlemeye veya bunlarla etkileşimde bulunmak için bir yol sağladığını bilmesi için kalıcı bir bildirim görüntüler. Buna bir örnek, bir podcast 'i kullanıcıya oynatan bir pod atama uygulaması veya belki daha sonra kullanılabilmesi için bir podcast bölümü indirmektir.
  • Yüksek öncelikli bir Firebase bulut iletisi (FCM) kullanın – Android bir uygulama için yüksek öncelikli bir FCM aldığında, bu uygulamanın arka planda hizmetleri kısa bir süre için çalıştırmasına izin verir. Bu, arka planda bir uygulamayı yoklayan arka plan hizmeti sağlamak için iyi bir alternatiftir.
  • Uygulamanın ön plana geldiği zamana yönelik Işi erteleyin ; önceki çözümlerin hiçbiri uygun değilse, uygulamalar, uygulama ön plana geldiğinde işleri duraklatmak ve devam ettirmeniz için kendi yolunu geliştirmelidir.