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.