Bir Hizmet İçinde Yayın Alıcısı


90

Bir BroadcastReceiveriçinde başlatmaya çalışıyorum Service. Yapmaya çalıştığım şey, servicegelen metin mesajlarını toplayan ve gelen telefon çağrılarını günlüğe kaydeden bir arka planda çalışıyor . Bunu yapmanın en iyi yolunun birservice , katalog yapabilen bir yayın alıcısı içeren bir koşuya .

Bunu nasıl yapacağım? Zaten hizmetim hazır ve çalışıyor.

Yanıtlar:


127

hizmetiniz zaten kurulduğundan, hizmetinize bir yayın alıcısı eklemeniz yeterlidir:

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
      }     
   }
};

hizmetinizde şunu yapın onCreate:

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 hizmetinizde onDestroy:

unregisterReceiver(receiver);

ve içinde bahsettiğiniz filtreler için yayın almaya gitmeniz iyi olur onCreate. Gerekirse herhangi bir izin eklediğinizden emin olun. örneğin

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

SendBroadcas (intent) ve braoadcastReceiver gönderirken intent.setData (myUri) ile veri geçiremediğimi fark ettim, bu durumda değil mi?
deadfish

BroadcastReceiver olduğunda hizmet yaşam döngüsü hakkında biraz kafam karıştı (benim durumumda BroadcastReceiver'ı indirin)
Kamran Majeed

1
@waqaslam Manifest'inizde bu BroadcastReceiver'ı ayarladınız mı?
IgorGanapolsky

2
@IgorGanapolsky Hayır, bu tür alıcıları manifest olarak kaydetmenize gerek yok.
waqaslam

2
@SayyedRizwan Hizmetiniz ve BroadcastReceiver aynı süreç altında ve büyük olasılıkla aynı iş parçacığı altında çalışacaktır (yeni bir tane oluşturmadıkça). Pil tüketimi,
dizinizi

25

Daha iyi model, bağımsız bir model oluşturmaktır BroadcastReceiver. Bu, uygulamanızın çalışıp Serviceçalışmadığına bakılmaksızın yayına yanıt verebilmesini sağlar . Aslında, bu kalıbı kullanmak, sürekli çalışma ihtiyacını ortadan kaldırabilir.Service tamamen .

Kayıt BroadcastReceiver Manifest'inizde ve bunun için ayrı bir sınıf / dosyası oluşturun.

Örneğin:

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

Alıcı çalıştığında, sadece bir Intent( Bundle) 'e iletirsiniz Serviceve ona yanıt verirsiniz .onStartCommand() .

Örneğin:

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

6
Yayının hizmetin yaşam döngüsü içinde olmasını istiyorum, böylece uygulama yalnızca hizmet süresi hattına göre mesajları / telefon çağrılarını sorguluyor. Bu yöntem bunu mümkün kılıyor mu? Yayının alımı hizmeti durduracak şekilde ayarlamışsınız gibi görünüyor.
Utopia025

Bu uygulama, Servicehalihazırda çalışmıyorsa başlar veya çalışıyorsa Intentyenisini geçirir (içeri almak için onStartCommand). Yalnızca Servicecanlı olduğunda çalışmasını istiyorsanız , Receiverbileşeni PackageManager's aracılığıyla programlı olarak etkinleştirebilir / devre dışı bırakabilirsiniz setComponentEnabledSetting().
Paul Burke

4
Sadece koşarken Receivercanlı Serviceolanı istiyorsanız, Waqas'ın cevabı en iyi seçeneğiniz olabilir .
Paul Burke

3
Bir Aktiviteniz yoksa, API 3.1 ve üstü için çalışmayacaktır: ashimita.blogspot.com.tr/2012/04/…
elif

1
Android 3.1'den itibaren, ilgili uygulama kullanıcı tarafından hiç başlatılmadıysa veya kullanıcı Android menüsü aracılığıyla uygulamayı açıkça durdurduysa, Android sistemi varsayılan olarak tüm alıcıları amaç almaktan hariç tutar. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.