Odbiornik transmisji w ramach usługi

90

Próbuję uruchomić a BroadcastReceiverw Service. To, co próbuję zrobić, to mieć uruchomione tło, servicektóre zbiera przychodzące wiadomości tekstowe i rejestruje przychodzące połączenia telefoniczne. Pomyślałem, że najlepszym sposobem, aby to osiągnąć, jest servicebieganie, które zawiera odbiornik telewizyjny, który może również katalogować.

Jak mam to zrobić? Mam już uruchomioną usługę.

Utopia025
źródło

Odpowiedzi:

127

ponieważ Twoja usługa jest już skonfigurowana, po prostu dodaj do niej odbiornik transmisji:

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

w swojej usłudze onCreatezrób to:

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

aw Twojej służbie onDestroy:

unregisterReceiver(receiver);

i możesz iść, aby odebrać transmisję dla wszystkich filtrów, o których wspomniałeś onCreate. W razie potrzeby dodaj uprawnienia. np

<uses-permission android:name="android.permission.RECEIVE_SMS" />
waqaslam
źródło
Zauważyłem, że nie mogę przekazać danych przez intent.setData (myUri) podczas wysyłania sendBroadcas (intent), a braoadcastReceiver nie działa w takim przypadku, czy to prawda?
martwa ryba
Jestem trochę zdezorientowany co do cyklu życia usługi, gdy ma BroadcastReceiver (w moim przypadku pobierz BroadcastReceiver)
Android Man
1
@waqaslam Czy ustawiłeś ten BroadcastReceiver w swoim Manifestie?
Igor Ganapolsky,
2
@IgorGanapolsky Nie, nie musisz rejestrować takich odbiorców w manifeście.
waqaslam
2
@SayyedRizwan Twoja usługa i BroadcastReceiver będą działać w ramach tego samego procesu i najprawdopodobniej w tym samym wątku (chyba że utworzysz nowy). Zużycie baterii zależy od tego, jak zdefiniowałeś swój wątek (tło / pierwszy plan) i ilość nadchodzących transmisji.
waqaslam
25

Lepszym sposobem jest stworzenie samodzielnego BroadcastReceiver. Zapewnia to, że Twoja aplikacja może odpowiedzieć na transmisję, niezależnie od tego, czy Servicejest uruchomiona. W rzeczywistości użycie tego wzorca może Servicecałkowicie wyeliminować potrzebę ciągłego działania .

Zarejestruj się BroadcastReceiverw swoim Manifeście i utwórz dla niego oddzielną klasę / plik.

Na przykład:

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

Kiedy odbiornik działa, po prostu przekazujesz Intent( Bundle) do Servicei odpowiadasz na to onStartCommand().

Na przykład:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}
Paul Burke
źródło
6
Chcę, aby transmisja znajdowała się w cyklu życia usługi, aby aplikacja wysyłała zapytania tylko do wiadomości / połączeń telefonicznych zgodnie z linią czasu usługi. Czy ta metoda to umożliwia? wygląda na to, że ustawiłeś go tak, że odbiór audycji uruchamia usługę.
Utopia025,
Ta implementacja uruchomiłaby, Servicejeśli jeszcze nie była uruchomiona, lub przekazałaby nową, Intentjeśli tak jest (do pobrania onStartCommand). Jeśli chcesz, aby działał tylko wtedy, gdy Servicejest aktywny, możesz programowo włączyć / wyłączyć Receiverkomponent za pomocą PackageManagerpliku setComponentEnabledSetting().
Paul Burke,
4
Odpowiedź Waqasa może być najlepszą opcją, jeśli chcesz Receiverżywego tylko wtedy, gdy Servicebiegnie.
Paul Burke,
3
Jeśli nie masz Aktywności, nie będzie działać z API 3.1 i nowszymi
elif
1
Począwszy od Androida 3.1 system Android domyślnie wyklucza odbieranie intencji przez wszystkie odbiorniki, jeśli odpowiednia aplikacja nigdy nie została uruchomiona przez użytkownika lub jeśli użytkownik wyraźnie zatrzymał aplikację za pomocą menu systemu Android. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik