Приемник вещания в службе


90

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

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

Ответы:


127

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

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" />

Я заметил, что я не могу передавать данные с помощью intent.setData (myUri) при отправке sendBroadcas (intent), а braoadcastReceiver в этом случае не работает, верно?
deadfish

Меня немного смущает жизненный цикл сервиса, когда у него есть BroadcastReceiver (в моем случае загрузите BroadcastReceiver)
Камран Маджид

1
@waqaslam Вы установили этот BroadcastReceiver в своем манифесте?
Игорь Ганапольский 05

2
@IgorGanapolsky Нет, регистрировать таких получателей в манифесте не нужно.
waqaslam

2
@SayyedRizwan. Ваша служба и BroadcastReceiver будут работать в одном процессе и, скорее всего, в одном потоке (если вы не создадите новый). Расход заряда батареи зависит от того, как вы определили свой поток (фоновый / передний план) и количество входящих трансляций.
waqaslam

25

Лучше всего создать автономный 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();
    }   
}

6
Я хочу, чтобы трансляция осуществлялась в рамках жизненного цикла службы, чтобы приложение запрашивало только сообщения / телефонные звонки в соответствии с временной шкалой службы. Позволяет ли этот метод? похоже, вы настроили его так, чтобы прием трансляции отключал службу.
Utopia025 05

Эта реализация запустит, Serviceесли он еще не запущен, или передаст новый, Intentесли он есть (для извлечения onStartCommand). Если вы хотите, чтобы он запускался только тогда, когда Serviceон активен, вы можете программно включить / отключить Receiverкомпонент с помощью PackageManagerфайлов setComponentEnabledSetting().
Пол Берк

4
Ответ Вакаса может быть вашим лучшим вариантом, если вам нужен только Receiverживой, когда Serviceон работает.
Пол Берк

3
Если у вас нет Activity, он не будет работать для API 3.1 и выше: ashimita.blogspot.com.tr/2012/04/…
elif

1
Начиная с Android 3.1, система Android по умолчанию исключает все приемники из получения намерений, если соответствующее приложение никогда не запускалось пользователем или если пользователь явно остановил приложение через меню Android. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Юрай Петрик,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.