Вещательный приемник внутри службы - PullRequest
85 голосов
/ 01 февраля 2012

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

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

Ответы [ 2 ]

118 голосов
/ 01 февраля 2012

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

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" />
22 голосов
/ 01 февраля 2012

Лучше создать автономный 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();
    }   
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...