Широковещательный приемник в службе

Я пытаюсь запустить BroadcastReceiver в пределах Service. Я пытаюсь сделать фоновый запуск Service, собирающий входящие текстовые сообщения, и регистрирует входящие телефонные звонки. Я решил, что лучший способ сделать это - запустить Service, который включает широковещательный приемник, который может каталогизировать.

Как мне это сделать? У меня уже есть обслуживание и работа.

Ответ 1

по мере того, как ваша служба уже настроена, просто добавьте широковещательный приемник в свою службу:

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

в вашем сервисе 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);

и в вашем сервисе onDestroy:

unregisterReceiver(receiver);

и вы можете пойти, чтобы получать трансляцию за то, что когда-либо фильтрует, вы упоминаете в onStartCommand. Обязательно добавьте любое разрешение. например,

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

Ответ 2

Лучшим шаблоном является создание автономного BroadcastReceiver. Это гарантирует, что ваше приложение сможет отвечать на широковещательную рассылку, независимо от того, выполняется ли Service. Фактически, использование этого шаблона может устранить необходимость в постоянном запуске Service вообще.

Зарегистрируйте BroadcastReceiver в манифесте и создайте для него отдельный класс/файл.

Например:

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

Когда приемник работает, вы просто передаете Intent (Bundle) в Service и отвечаете на него в onStartCommand().

Например:

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