5

Android bir hizmetindeki bir Uyandırma kilidi kullanma. Ben wakelock oluşturmak ve onCreate() içinde etkinleştirmek ve on destroy() içinde serbest bırakın ancak "wl çözülemez" hatası alıyorum. Birisi bunun üstesinden nasıl gelebileceğimi açıklayabilir mi? Aşağıdaki kodu:yüzden kalıcı olarak uygulama çalışırken ekranı bırakabilirsiniz Uyandırma kilidi kontrol etmek için bir hizmeti kullanmak için çalışıyorum Merhaba 1.5

public class WakeLockService extends Service { 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 
    @Override 
    public void onCreate() { 
     PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 
     wl.acquire(); 
    } 
    @Override 
    public void onDestroy() { 
     wl.release(); 
    } 
} 

cevap

5

Eğer OnDestroy çizgi

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag"); 

() eksik değil? OnCreate() 'da yerel bir değişkendir, ancak onDestroy()' da hiç bildirilmemiştir.

Ya da daha muhtemel, bunu sınıf WakeLockService yerine yerel bir değişkenin bir saha yapmak isteyebilirsiniz.

9

Eh, bir örnek değişkeni kullanmak istiyorsunuz bile ben bunu yapmak için bir yol değildir düşünürdüm. destroy()'u kim arayacak? Umarım sen değilsin, bunu yapmak OS işletimidir. Ancak, bir uyandırma kilidi tuttuğunuzda, destroy() yönteminizin çağrılması pek olası değildir çünkü işletim sistemi ilk önce diğer etkinlikleri/hizmetleri yok edecektir. Bunun yanı sıra

, bu onCreate() yöntemde uyandırma kilidi elde etmek için yol çok geç. onCreate()'a ulaşılmadan önce, Servis'i bir alarmdan arka planda bulunan bir etkinlikten tetiklediğinizde zaten uykuya dalmış olabilir.

Çok fazla bağlam sağladığınızdan farklı olarak ne yapmanız gerektiğini söylemek zor. Olayların olağan seyri budur. A BroadcastReceiver çağrılır ve onReceive()'da uyandırma kilidini edin ve hizmetinizde statik bir değişkene koyun. Hizmet bittiğinde, stopSelf() numaralı telefonu çağırmalı, uyandırma kilidini serbest bırakmalı ve ardından kilitle ilgili referansı tutan statik değişkeni sıfırlamalıdır. Eğer bir Hizmeti kullanmak eğer

Ayrıca tam bir uyanıklık kilit istediğiniz gibi değil çok büyük olasılıkla, ama kısmi uyanıklık kilittir. Ekranda kalmak için ekrana ihtiyacın yok değil mi?

Maalesef uyandırma kilitleri gerçekten çünkü yukarıda açıklanan tam konuların kullanımı karmaşıktır. Bu kesinlikle gelişmiş bir konu ve berbat etmek kolaydır. Bunu yaparsanız, uygulamanız çok çirkin yorumlar alacaktır, çünkü çok uzun süre dayanmak bataryayı boşalttığı için büyük bir suçtur. Yanlış anlama, lütfen ama burada yazdığınız sorunun niteliği göz önünde bulundurulduğunda (sözdizimi/derleyici hatası) Bir Servis ve uyandırma kilidi olmadan bir çözüm aramanızı şiddetle tavsiye ederim.

+0

Yorum için teşekkürler. Uygulamada% 100 uyandırma modunda olması için telefona ihtiyacım var, bu yüzden tam uyanma kilidini kullandım. – Tom

+0

CPU'yu çalıştırmak ve ağı kullanmak için kısmi bir uyanıklık yeterli olmalıdır. – Eno

+0

Benden de teşekkürler. Açıklamalarınız kısa ve özlü soru ve cevaptan daha yararlıdır :) – Melllvar

İlgili konular