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, zaman alan hesaplamalar, dosyaları indirme, müzik çalma vb. gibi arka planda gerçekleştirilen görevler için çok yaygın olarak kullanılır. Hizmetlerin uygun olduğu farklı senaryoları açıklar ve hem uzun süre çalışan arka plan görevlerini gerçekleştirmek hem de uzak yordam çağrıları için bir arabirim sağlamak için bunların nasıl uygulandığını gösterir.

Android Hizmetlerine Genel Bakış

Mobil uygulamalar masaüstü uygulamaları gibi değildir. Masaüstleri, ekran emlak, bellek, depolama alanı ve bağlı güç kaynağı gibi çok miktarda kaynağa sahiptir, mobil cihazlar bunu yapmaz. Bu kısıtlamalar mobil uygulamaları farklı davranmaya zorlar. Örneğin, mobil cihazdaki küçük ekran genellikle aynı anda yalnızca bir uygulamanın (etkinlik) görünür olduğu anlamına gelir. Diğer Etkinlikler arka plana taşınır ve herhangi bir iş gerçekleştiremeyecekleri askıya alınmış duruma iletilir. Ancak, bir Android uygulamasının arka planda olması, uygulamanın çalışmaya devam etmesi imkansız olduğu anlamına gelmez.

Android uygulamaları şu dört birincil bileşenden en az birinden oluşur: Etkinlikler, Yayın Alıcıları, İçerik Sağlayıcıları ve Hizmetler. Etkinlikler, bir kullanıcının uygulamayla etkileşim kurmasına izin veren kullanıcı arabirimini sağladığından birçok harika Android uygulamasının köşe taşıdır. Ancak, eşzamanlı veya arka plan çalışması gerçekleştirme söz konusu olduğunda, Etkinlikler her zaman en iyi seçenek değildir.

Android'de arka plan çalışması için birincil mekanizma hizmettir. Android hizmeti, kullanıcı arabirimi olmadan bazı işler yapmak için tasarlanmış bir bileşendir. Bir hizmet dosya indirebilir, müzik çalabilir veya görüntüye filtre uygulayabilir. Hizmetler, Android uygulamaları arasında işlemler arası iletişim (IPC) için de kullanılabilir. Örneğin, bir Android uygulaması başka bir uygulamadan gelen müzik çalar hizmetini kullanabilir veya bir uygulama bir hizmet aracılığıyla verileri (bir kişinin kişi bilgileri gibi) diğer uygulamalarda kullanıma sunar.

Hizmetler ve arka plan çalışması yapabilmeleri, sorunsuz ve akıcı bir kullanıcı arabirimi sağlamak için çok önemlidir. Tüm Android uygulamalarının Üzerinde Etkinlikler'in çalıştırıldığı bir ana iş parçacığı (UI iş parçacığı olarak da bilinir) vardır. Cihazın yanıt verme hızını korumak için Android'in kullanıcı arabirimini saniyede 60 kare hızında güncelleştirebilmesi gerekir. Bir Android uygulaması ana iş parçacığında çok fazla iş yaparsa, Android çerçeveleri bırakır ve bu da kullanıcı arabiriminin sarsıntılı görünmesine neden olur (bazen janky olarak da adlandırılır). Bu, ui iş parçacığında gerçekleştirilen tüm çalışmaların yaklaşık 16 milisaniye (her 60 karede 1 saniye) olan iki kare arasındaki süre içinde tamamlanması gerektiği anlamına gelir.

Bu sorunu gidermek için bir geliştirici, kullanıcı arabirimini engelleyecek bazı işleri gerçekleştirmek için bir Etkinlikteki iş parçacıklarını kullanabilir. Ancak bu sorunlara neden olabilir. Android'in Etkinliğin birden çok örneğini yok edip yeniden oluşturması çok olasıdır. Ancak Android, iş parçacıklarını otomatik olarak yok etmediğinden bellek sızıntılarına neden olabilir. Bunun en önemli örneklerinden biri, cihazın döndürülme zamanıdır. Android, Etkinlik örneğini yok etmeye çalışır ve ardından yenisini yeniden oluşturur:

When device rotates, instance 1 is destroyed and instance 2 is created

Bu olası bir bellek sızıntısıdır; Etkinliğin ilk örneği tarafından oluşturulan iş parçacığı çalışmaya devam eder. İş parçacığının Etkinliğin ilk örneğine bir başvurusu varsa bu, Android'in nesneyi çöp toplamasını engeller. Ancak, Etkinliğin ikinci örneği hala oluşturulur (bu da yeni bir iş parçacığı oluşturabilir). Cihazı birkaç kez hızla döndürmek tüm RAM'i tüketebilir ve Android'i belleği geri kazanmak için uygulamanın tamamını sonlandırmaya zorlayabilir.

Temel bir kural olarak, gerçekleştirilecek çalışma bir Etkinlikten uzun süre sonra gerçekleştirilecekse, bu işi gerçekleştirmek için bir hizmet oluşturulmalıdır. Ancak, çalışma yalnızca bir Etkinlik bağlamında geçerliyse, işi gerçekleştirmek için bir iş parçacığı oluşturmak daha uygun olabilir. Örneğin, bir fotoğraf galerisi uygulamasına yeni eklenen bir fotoğraf için küçük resim oluşturma işlemi büyük olasılıkla bir hizmette gerçekleşmelidir. Ancak, bir iş parçacığı yalnızca bir Etkinlik ön plandayken duyulması gereken bazı müzikleri çalmak için daha uygun olabilir.

Arka plan çalışması iki geniş sınıflandırmaya ayrılabilir:

  1. Uzun Süre Çalışan Görev – Bu, açıkça durdurulana kadar devam eden bir iştir. Uzun süre çalışan bir göreve örnek olarak, müzik akışı sağlayan veya algılayıcıdan toplanan verileri izlemesi gereken bir uygulama örnektir. Uygulamanın görünür bir kullanıcı arabirimi olmasa bile bu görevlerin çalışması gerekir.
  2. Periyodik Görevler – (bazen iş olarak da adlandırılır) Düzenli bir görev, görece kısa süreli (birkaç saniye) olan ve bir zamanlamaya göre çalıştırılan görevdir (örneğin, bir hafta boyunca günde bir kez veya belki de sonraki 60 saniyede bir kez). Bunun bir örneği, internetten dosya indirmek veya bir görüntü için küçük resim oluşturmaktır.

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

  • Bağlı Hizmet : Bağlı hizmet , ona bağlı başka bileşenlere (genellikle bir Etkinlik) sahip olan bir hizmettir. Bağlı hizmet, bağlı bileşenin ve hizmetin birbiriyle etkileşim kurmasına olanak tanıyan bir arabirim sağlar. Hizmete bağlı başka istemci kalmadıktan sonra Android hizmeti kapatır.

  • IntentService – a IntentService , hizmet oluşturmayı ve kullanımı basitleştiren sınıfının özelleştirilmiş bir alt sınıfıdır Service . , IntentService bağımsız otonom çağrıları işlemeye yöneliktir. Birden çok çağrıyı eşzamanlı olarak işleyebilen bir hizmetin aksine, IntentService daha çok iş kuyruğu işlemcisine benzer; iş kuyruğa alınır ve IntentService her işi tek bir çalışan iş parçacığında birer birer işler. Genellikle, birIntentService etkinlik veya parçaya bağlı değildir.

  • Başlatıldı HizmetiBaşlatılan hizmet , başka bir Android bileşeni (Etkinlik gibi) tarafından başlatılan ve hizmete açıkça durmasını söyleyene kadar arka planda sürekli olarak çalıştırılan bir hizmettir. Bağlı hizmetlerden farklı olarak, başlatılan bir hizmetin doğrudan ona bağlı hiçbir istemcisi yoktur. Bu nedenle, gerektiğinde düzgün bir şekilde yeniden başlatılabilmeleri için başlatılan hizmetleri tasarlamak önemlidir.

  • Karma Hizmet : Karma hizmet, başlatılan bir hizmetin ve bağlı hizmetin özelliklerine sahip olan bir hizmettir. Karma hizmet, bir bileşen ona bağlandığında veya bir olay tarafından başlatıldığında başlatılabilir. İstemci bileşeni karma hizmete bağlı olabilir veya olmayabilir. Karma hizmet, açıkça durdurulması söyleninceye kadar veya ona bağlı başka istemci kalmayıncaya kadar çalışmaya devam eder.

Kullanılacak hizmet türü uygulama gereksinimlerine çok bağlıdır. Temel kural olarak, IntentService android uygulamasının gerçekleştirmesi gereken görevlerin çoğu için bir veya bağlı hizmet yeterlidir, bu nedenle bu iki hizmet türünden birine tercih edilmelidir. , IntentService dosya indirme gibi "tek seferlik" görevler için iyi bir seçimdir, ancak bir Etkinlik/Parça ile sık sık etkileşimler gerektiğinde bağlı bir hizmet uygun olacaktır.

Çoğu hizmet arka planda çalışırken, ön plan hizmeti olarak bilinen özel bir alt kategori vardır. Bu, kullanıcı için bazı işler (müzik çalma gibi) gerçekleştirmek için daha yüksek önceliğe (normal bir hizmete kıyasla) verilen bir hizmettir.

Bir hizmeti aynı cihazda kendi işleminde çalıştırmak da mümkündür; bu bazen uzak hizmet veya işlem dışı hizmet olarak adlandırılır. Bu, oluşturmak için daha fazla çaba gerektirir, ancak bir uygulamanın işlevselliği diğer uygulamalarla paylaşması gerektiğinde yararlı olabilir ve bazı durumlarda uygulamanın kullanıcı deneyimini geliştirebilir.

Android 8.0'da Arka Plan Yürütme Sınırları

Android 8.0'dan (API düzeyi 26) başlayarak, bir Android uygulaması artık arka planda serbestçe çalışma özelliğine sahip değildir. Ön plandayken, bir uygulama kısıtlama olmadan hizmetleri başlatabilir ve çalıştırabilir. Bir uygulama arka plana geçtiğinde Android, uygulamaya hizmetleri başlatması ve kullanması için belirli bir süre verir. Bu süre geçtikten sonra uygulama artık hiçbir hizmeti başlatamıyor ve başlatılan hizmetler sonlandırılacak. Bu noktada uygulamanın herhangi bir çalışma yapması mümkün değildir. Aşağıdaki koşullardan biri karşılanırsa Android bir uygulamayı ön planda olarak kabul eder:

  • Görünür bir etkinlik var (başlatıldı veya duraklatıldı).
  • Uygulama bir ön plan hizmeti başlattı.
  • Başka bir uygulama ön plandadır ve arka planda aksi halde olabilecek bir uygulamadaki bileşenleri kullanıyor. Bunun bir örneği, ön planda yer alan Uygulama A'nın Uygulama B tarafından sağlanan bir hizmete bağlı olmasıdır. B uygulaması ön planda da dikkate alınır ve Android tarafından arka planda olduğu için sonlandırılmaz.

Bir uygulama arka planda olsa bile Android'in uygulamayı uyandırması ve birkaç dakika boyunca bu kısıtlamaları gevşeterek uygulamanın bazı işler gerçekleştirmesine olanak sağlaması gibi bazı durumlar vardır:

  • Uygulama tarafından yüksek öncelikli bir Firebase Bulut İletisi alınır.
  • Uygulama bir yayın alır.
  • Uygulama bir Bildirime yanıt olarak bir PendingIntent alır ve yürütür.

Mevcut Xamarin.Android uygulamalarının Android 8.0'da ortaya çıkabilecek sorunları önlemek için arka plan çalışmalarını nasıl gerçekleştirdiklerini değiştirmeleri gerekebilir. Android hizmetinin bazı pratik alternatifleri şunlardır:

  • Android İş Zamanlayıcı'yı veya Firebase İş Dağıtıcısı'nı kullanarak arka planda çalışacak şekilde çalışma zamanlama – Bu iki kitaplık, uygulamaların arka plan çalışmalarını ayrı bir çalışma birimi olan işlere ayırması için bir çerçeve sağlar. Uygulamalar daha sonra, işin ne zaman çalışabileceğine ilişkin bazı ölçütlerle birlikte işi işletim sistemiyle zamanlayabilir.
  • Hizmeti ön planda başlatın; ön plan hizmeti, uygulamanın arka planda bir görev gerçekleştirmesi gerektiğinde ve kullanıcının belirli aralıklarla bu görevle etkileşim kurması gerektiğinde kullanışlıdır. Ön plan hizmeti, kullanıcının uygulamanın bir arka plan görevi çalıştırdığını bilmesi ve ayrıca görevi izlemesi veya görevle etkileşim kurması için bir yol sağlaması için kalıcı bir bildirim görüntüler. Bunun bir örneği, kullanıcıya bir pod yayını yürüten veya daha sonra keyfini çıkarabilmek için bir pod yayını bölümü indiren bir pod yayını uygulaması olabilir.
  • Yüksek öncelikli bir Firebase Bulut İletisi (FCM) kullanın : Android bir uygulama için yüksek öncelikli bir FCM aldığında, bu uygulamanın hizmetleri kısa bir süre için arka planda çalıştırmasına izin verir. Bu, arka planda bir uygulamayı yoklayan bir arka plan hizmetine sahip olmanın iyi bir alternatifi olabilir.
  • Uygulama ön plana çıktığında çalışmayı ertele – Önceki çözümlerden hiçbiri uygun değilse, uygulama ön plana geldiğinde uygulamaların çalışmayı duraklatmak ve sürdürmek için kendi yöntemlerinden birini geliştirmesi gerekir.