2011-12-05 15 views
8

İki öğe içeren basit bir uygulama yazıyorum - Servis ve Etkinlik. Etkinlik sadece hizmeti başlatmak ve durdurmak için kullanılır. Servis, geçerli CellID, LAC ve RSSI (sinyal gücü) hakkında bilgi almak ve bunları dosyaya kaydetmek için PhoneStateListener kullanır.PhoneStateListener onSignalStrengthsHizmete çağrılan değiştirilen duraklar

Telefon uyumadığı sırada her şey iyi çalışıyor. Ekranı kapattıktan ve birkaç dakika işlem yapılmadığında artık PhoneStateListener numaramın çağrılmadığını fark ettim. PARTIAL_WAKE_LOCK (ve diğer tip kilitler) servisimi de eklemeyi denedim, ancak sanırım ciddi bir pil boşalmasına neden oluyor ve bu şekilde kullanılmamalıdır. Öte yandan bana gerçekten yardımcı olmadı. Başka bir denemem Timer'ı kullanmak ve PhoneStateListener kayıtlarını belirli aralıklarla kaydetmem/kaydettirmekti. Beklenmedik biçimde, bu şekilde CellId ve LAC'yi yenilemeye yardımcı oldu (bu yüzden dinleyiciden onCellLocationChanged() arandığını sanıyorum), ancak sinyal gücü hala güncellenmedi.

BroadcastReciever'u kullanmayı denemedim, ancak bazılarının konu üzerinde kazandıktan ve SO üzerinde okuma konularını okuduktan sonra bunun benim için çalışacağını düşünmüyorum.

Özetle, sorum şu: Neden telefon uykuda iken PhoneStateListener yöntemleri çağrılmadı? Bu davranışı verimli bir şekilde aşmak için (uyandırmak veya farklı mekanizmaları kullanmak gibi) bir yol var mı?

+0

'Beklenmedik, bu şekilde yardım ettiğini görünüyor .. .Bu, beklenmedik bir şekilde, dinleme notlarının belgelenmesiyle ilgili emin değilim 'Kayıt sırasında ve belirli bir telefon durumu değiştiğinde, telefon yöneticisi i uygun geri arama yöntemini geçersiz kılar. – tidbeck

cevap

7

Ekran kapalıyken, android hücre ve sinyal değişiklikleri ile ilgili bildirimleri durdurur. Bu, RIL düzeyinde URC bildirimlerini devre dışı bırakarak yapar. Bildiğim kadarıyla, ekranı açmadan güncellemeleri alamıyorsunuz. Bir yayın alıcısı, farklı bir şekilde çalışmaz.

Eğer sizin için pratik ise, bu değerleri kontrol etmek istediğinizde ekranın açılmasını öneririm. Bunu bir uyandırma kilidi alarak ve bayrakları sağlayarak yapabilirsiniz: ACQUIRE_CAUSES_WAKEUP | SCREEN_DIM_WAKE_LOCK

Düzenleme: Yeniden kayıt dinleyici aslında yürütülecek konum değişikliğini tetikleyecek, ancak geçerli hücre bilgisi, gidiyor önceki ekrana sadece son bilinen hücre bilgisi geçmez. Mevcut hücre bilgisini almak için, ekranı açmanız gerekecektir. başında

1

çağrı:

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "call_lock"); 

ve sonunda

:

wakeLock.release(); 

Eğer izin gerekir:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
İlgili konular