Flutter ile Pil Dostu Ezan Vakti Motoru Geliştirmek

İslami yaşam tarzı uygulamaları pazarında, kullanıcıların bir numaralı şikayeti değişmez: "Pil Tüketimi". Bu teknik bir paradokstur: Kullanıcılar konumlarına göre hassas namaz vakitleri isterler, ancak bunun bedeli olan sürekli GPS kullanımının pillerini tüketmesinden nefret ederler.
Çoğu geliştirici bu sorunu "Kaba Kuvvet" (Brute-Force) yöntemiyle, yani konum servislerini sürekli açık tutarak veya işlemciyi (CPU) her birkaç dakikada bir uyandırarak çözmeye çalışır. Miftah Al Hayat için ben bu takası kabul etmeyi reddettim. Hedefim iddialıydı: Sıfır hissedilebilir pil etkisi ile çalışan, konum duyarlı bir motor inşa etmek.
İşte sektör standartlarına göre %90'ın üzerinde verimlilik artışı sağladığımız mühendislik mimarisi.
Anti-Pattern: Uygulamalar Neden Pili Sömürür?
Çözümümüzü anlamak için önce geleneksel mimarilerdeki sorunu masaya yatırmalıyız.
Standart namaz vakti uygulamaları genellikle aktif sorgulama (active polling) yöntemine güvenir. Seyahat durumunu "otomatik algılamak" için GPS radyosunu sıcak tutarlar veya sırf ekrandaki geri sayım sayacını güncellemek için Android'in AlarmManager servisini kötüye kullanarak cihazı her dakika uyandırırlar. Bu durum, telefonun modern pil ömrü için hayati olan "Derin Uyku" (Deep Doze) moduna girmesini engeller.
Eğer uygulamanız telefonu uyanık tutuyorsa, hiçbir kod optimizasyonu pili kurtaramaz. Buradaki darboğaz, radyo donanımının kendisidir.
Çözüm: "Önceden Hesapla" (Calculate-Ahead) Mimarisi
Her dakika "Nerdeyim?" diye sormak yerine, Miftah Al Hayat modeli tersine çevirir. Hesaplamayı şimdiki zamandan ayrıştıran, Önce-Yerel, Önceden-Hesapla stratejisini kullanıyoruz.
1. Matematiksel Avantaj (Adhan Dart)
Biz aslında geleceği "önceden işliyoruz" (pre-compute). Uygulama kurulduğunda veya konum değiştiğinde, adhan_dart kütüphanesini kullanarak cihaz üzerinde önümüzdeki 30 günün namaz vakitlerini saniyeler içinde hesaplıyoruz.
// Basitleştirilmiş Mantık: Bir kere hesapla, haftalarca kullan
final coordinates = Coordinates(lat, lng);
final params = CalculationMethod.muslimWorldLeague();
// Milisaniyeler sürer ve ihmal edilebilir CPU kullanır
final prayerTimes = PrayerTimes.today(coordinates, params);
graph TD
A[Uygulamayı Kur] --> B[30 Günü Cihazda Hesapla]
B --> C[Takvimi Veritabanına Kaydet]
C --> D[Bildirimleri Zamanla]
D --> E((Uyu))
E -->|Kullanıcı Açar| F[Yerel DB'den Göster]
E -->|Background Fetch (Günde 1)| G[Konum Değişimi Kontrol]
G -->|Değişim Yok| E
G -->|Değişim > 50km| B
Bu sayede uygulama, yaşam döngüsünün %99'unda aslında statik bir okuyucudur. Bugünün Akşam namazı vaktini söylemek için bir API'ye gitmesine veya GPS'i sorgulayıp uyandırmasına gerek yoktur. Cevabı zaten biliyordur.
2. İşletim Sistemi Seviyesi Optimizasyon (Background Fetch)
Peki ya kullanıcı seyahat ederse? Sürekli takip yerine, işletim sisteminin background_fetch ile sunduğu akıllı zamanlamadan yararlanıyoruz.
Uygulamayı günde sadece bir kez, genellikle işletim sisteminin en verimli bulduğu anda (örneğin cihaz şarjdayken ve Wi-Fi'dayken) uyandırıyoruz. Bu kısa pencerede (genellikle 30 saniyeden az) şunları yapıyoruz:
- "Kaba Konum"u (Coarse Location) kontrol et (Ağ tabanlı, düşük güç).
- Eğer konum belirgin şekilde değişmişse (>50km), takvimi yeniden hesapla.
- Önümüzdeki 24 saatin sistem bildirimlerini toplu olarak zamanla.
// Verimli Toplu Zamanlama (Batch Scheduling)
await LocalNotifications.schedule([
Notification(id: 1, time: fajrTime, body: "İmsak Vakti"),
Notification(id: 2, time: dhuhrTime, body: "Öğle Vakti"),
// ...
]);
3. "İstemci Taraflı İzdüşüm" (Client-Side Projection) Hilesi
İnce ama kritik bir optimizasyon da geri sayım sayacını nasıl yönettiğimizdir. Yeni başlayanlar genellikle sayacı ilerletmek için arka planda bir servis çalıştırır.
Miftah'ta UI geri sayımı tamamen istemci taraflı bir izdüşümdür. Arka plan işlemi UI ile ilgilenmez. Arayüz sadece saklanan statik zaman damgasına bakar ve farkı hesaplar: KalanSüre = SonrakiVakit - ŞuAnkiSistemSaati.
Bu şu demektir: Uygulamayı kapattığınızda, gerçekten kapanır. Gizli servisler yok. Arka planda "tık tık" işleyen sayaçlar yok. Sadece sessizlik.
Sonuç: Güven İçin Mühendislik
"Aktif Sorgulama" zihniyetinden "Zamanla ve Uyu" mimarisine geçiş yaparak, Miftah Al Hayat'ın 24 saatlik arka plan pil tüketimini %1'in altına indirdik.
Bu sadece teknik bir optimizasyon değil, aynı zamanda bir ürün kararıydı. Bu sayede Miftah Al Hayat'ı sadece "bir başka namaz uygulaması" olarak değil, modern kullanıcı için gizlilik odaklı, pil dostu bir alternatif olarak pazarlayabiliyoruz.
Bu mimari, gizlilik ve performansın, sonradan eklenen özellikler değil, temel yapı taşları olarak ele alındığı "Önce-Yerel" (Local-First) mühendislik felsefemin bir parçasıdır.
[!TIP] Farkı kendiniz görün: Miftah Al Hayat'ı hemen indirin: App Store | Google Play.