13

Handlers ile 5 dakikadan fazla olmayan aralıklarla çalıştırılan bir etkinliğim var. bu olduğunda emin işlemci uyku modunda için çok faaliyeti BroadcastReceiver başlatılan ve telefon kapmak ve kullanıcı girişi almak için kullanıcı için bekleyen ekran kapalıyken başlattı olabilir, etkinlik onPause() denir. Ekranı açmak için aktiviteyi ayarlamadım çünkü mümkün olduğunca çok pil tasarrufu yapmak istiyorum.İşleyici gönderici CPU uyurken yanmıyor mu?

Telefonumla ile test edilmiş ve ekran tüm Handlers onlar koşmak zorunda tüm kodu yürütmek kapalı iken, gerçekten iyi çalışıyor ettik. Aktivite açıkken ekranı açıp kapatırsam her şey iyi çalışıyor.

Şimdi, ekran söner ve CPU Akselerometrelerle, çoğu zaman uyur zaman beklendiği gibi bazı cihazlar çalışmıyor her yerde okudum. Şimdi benim sorum şu, ben bir WakeLock almam gerekiyor mu, bu yüzden etkinlik açıkken CPU uyumuyor mu? Bunu gerçekten bilmek istiyorum çünkü daha önce de söylediğim gibi, pahalı bir WakeLock alarak pili 'harcamak' istemiyorum.

Bunun nasıl çalıştığını gerçekten bilen bir kişi ayrıntılı bir cevabı tercih ederim.

+0

Ve neden arka plan görevleri yapmak Etkinlikleri kullanıyorsunuz? Etkinlik göstermek, işleri görüntülemek ve görevleri yürütmek için kullanılır. Hizmetlere baktınız mı? – tolgap

+0

Hayır, etkinlik arka plan görevleri yapmıyor. Kullanıcının telefonu kontrol etmesini ve görmesini beklediği bir Yayın Alıcısı ile açılan bir etkinlik var, ancak KEEP_SCREEN_ON bayrağını eklemek istemiyorum, bu yüzden bazen etkinlik ekran kapalıyken (veya ekran) açık etkinlik açıkken kapanır). –

cevap

20

Amacınız kararlı bir şekilde sizin yaklaşımla elde edilemez. Bir Handler'in postDelayed() yöntemini kullanırsanız ve CPU derin uykuya daldığında, MS sayacı duracak ve yalnızca CPU yeniden uyandığında devam edecektir.

See this for more detail.

Yani Uyandırma kilidi kullanmanız gerekecektir bir cron işi çeşit sahip olmak istiyorsanız. Neyse işte bunu yapıyor Servis uygulaması vardır: doc itibaren Wakeful IntentService

:

işleri ve Windows zamanlanmış görevler cron Android'in eşdeğer tavsiye desen AlarmManager kullanmaktır. Hizmet bir arka plan iş parçacığı üzerinde yapmak ve daha fazla iş yok olduğunda kapatmak gibi bir IntentService ile birleştiğinde, bu iyi çalışır. Küçük bir sorun var: IntentService cihazı uyandırmak için hiçbir şey yapmıyor. Alarm bir WAKEUP varyantı olsaydı, telefon alarmı ele geçiren BroadcastReceiver onReceive() yönteminde iken uyanık kalır. Aksi halde, telefon uykuya dalabilir. WakefulIntentService, IntentService'nin kolaylığını kısmi bir WakeLock ile birleştirerek bununla mücadele etmeye çalışır.

+0

Fena değil, ama gereksinimleri karşılamıyor, CPU'yu yaptığım gibi bir WakeLock ile tutar. Sorun şu ki, İşleyicilerimin ekran kapalıyken ve etkinlik bittiğinde çalışmaya devam etmesi için bu kısmi WakeLock'a ihtiyacım var mı? Cihazımda WakeLock olmadan çalışır, ancak tüm Android telefonların işleyişinin ya da cihaz özelliklerine bağlı olup olmadığını bilmiyorum. Eğer öyleyse, bunu kimin söylediğini veya dokümantasyonda nerede göründüğünü bilmek istiyorum çünkü hiçbir şey bulamıyorum. Cevabınız için teşekkür ederiz, bazı şeyler için kullanışlı olacak, CWAC bazı serin kütüphaneleri var. –

+0

Bir altenatif olarak, alarm çaldığında bir Niyet gönderen AlarmManager.setInexactRepeating(), alarmı tekrarlayan alarmı denediniz mi? http://developer.android.com/reference/android/app/AlarmManager.html – for3st

+0

Bazı İşleyicileri saniyede 2/3 kez yürütür, bu yüzden bunun için AlarmManager'ı kullanmanın kötü bir fikir olduğunu düşünüyorum. Her şey iyi ve çalışıyor ve çok fazla pil tüketmiyor, ancak uygulamayı WakeLock'ı kaldırarak daha az pil tüketiyorsa, bunu yapacağım. Tek ve asıl soru gerçekten WakeLock kullanmam gerekiyorsa, çünkü resmi dokümantasyonda çalışmamaları için ihtiyaç duyduğum her yerde okumam ve telefonumda uygulama WakeLock olmadan mükemmel çalışıyor, ama nasıl yapılacağını bilmiyorum Kullanabileceğim tek Android cihaz benimki için başka cihazlarda çalışacak: -/ –