2012-02-01 19 views
74

Service içinde bir BroadcastReceiver başlatmaya çalışıyorum. Yapmaya çalıştığım, gelen metin mesajlarını toplayan ve gelen telefon çağrılarını kaydeden service numaralı bir arka plana sahip olmak. Bunu yapmanın en iyi yolunun, her ikisi de kataloglayabilen bir yayın alıcısı içeren bir service çalışması olması olduğunu düşündüm.Yayıncı Bir Hizmet İçinde Yayın Alıcısı

Bunu yapmayı nasıl yaparım? Hizmetim var ve çalışıyor. Servis kurulum zaten olduğu gibi

cevap

106

, sadece hizmetinde bir yayın alıcısı ekleyin:

private final BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 
     if(action.equals("android.provider.Telephony.SMS_RECEIVED")){ 
     //action for sms received 
     } 
     else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ 
      //action for phone state changed 
     }  
    } 
}; 

yılında servis en onCreate bunu:

IntentFilter filter = new IntentFilter(); 
filter.addAction("android.provider.Telephony.SMS_RECEIVED"); 
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED); 
filter.addAction("your_action_strings"); //further more 
filter.addAction("your_action_strings"); //further more 

registerReceiver(receiver, filter); 

ve servis en onDestroy:

unregisterReceiver(receiver); 

ve hangi e için yayın almak için gitmek için onStartCommand'da bahsettiğiniz filtreler. Gerekirse herhangi bir izin verdiğinizden emin olun. örneğin

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
+0

i tost mesajı gelen çağrıyı yaparken görüntülemek istiyor. Bu filter.addAction ("android.provider.Telephony.LISTEN_CALL_STATE") ekledim; o zaman nasıl tost gösterirsin. – Prasad

+0

Fark ettim ki sendBroadcas (intent) ve braoadcastReceiver gönderirken intent.setData (myUri) ile veriyi iletemiyorum, bu durumda çalışmıyor, doğru mu? – deadfish

+0

Ben BroadcastReceiver (benim durumumda BroadcastReceiver) –

23

Daha iyi bir desen, bağımsız bir BroadcastReceiver oluşturmaktır. Bu, uygulamanızın, Service'un çalışıp çalışmadığını yayınlamaya yanıt verebileceğini garanti eder. Aslında, bu modelin kullanılması, sürekli çalışan bir Service ihtiyacını tamamen ortadan kaldırabilir.

Manifest'inize BroadcastReceiver kodunu kaydedin ve bunun için ayrı bir sınıf/dosya oluşturun.

Ör: Alıcı çalıştırıldığında

<receiver android:name=".FooReceiver" > 
    <intent-filter > 
     <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
    </intent-filter> 
</receiver> 

, sadece Service bir Intent (Bundle) geçmek ve onStartCommand() kendisine cevap verirler.

Örn:

public class FooReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     // do your work quickly! 
     // then call context.startService(); 
    } 
} 
+3

Yayının hizmetin yaşam döngüsünde olmasını istiyorum, böylece uygulama sadece servis zaman hattına göre mesaj/telefon aramaları sorgulamaktadır. Bu yöntem bunu sağlar mı? ayarlanmış gibi görünüyor, böylece yayın alımı hizmeti kapatır. – Utopia025

+0

Bu uygulama, zaten çalışmıyorsa, "Hizmet" i başlatır veya yeni bir "Intent" (eğer onStartCommand'ta alma için) olursa iletir. Sadece 'Servis' canlı olduğunda çalıştırılmasını istiyorsanız, 'Receiver' bileşenini' PackageManager'' 'setComponentEnabledSetting()' yoluyla programatik olarak etkinleştirebilir/devre dışı bırakabilirsiniz. –

+3

Waqas'ın cevabı en iyi seçeneğiniz, eğer 'Servis' çalışırken 'Alıcının' canlı olmasını istiyorsanız. –

İlgili konular