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


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

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

2 77

2 ответа:

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

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

и вы хорошо идти, чтобы получить трансляцию для того, что когда-либо фильтры вы упоминаете в onCreate. Не забудьте добавить любое разрешение, если это необходимо. например,

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

лучший шаблон для создания автономной 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();
    }   
}