2012-02-01 6 views
74

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

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

ответ

106

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

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

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

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

я хочу, чтобы отобразить тосты сообщения при входящем вызове. Я добавил этот filter.addAction ("android.provider.Telephony.LISTEN_CALL_STATE"); то как сделать тост. – Prasad

+0

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

+0

Я немного путаюсь в отношении жизненного цикла службы, когда у него есть BroadcastReceiver (в моем случае скачать BroadcastReceiver) –

23

Лучшим вариантом является создание автономного 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(); 
    } 
} 
+3

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

+0

Эта реализация запустит «Сервис», если она еще не запущена, или передать новое «Intent», если оно есть (для поиска в 'onStartCommand'). Если вы хотите, чтобы он запускался только в режиме «Сервис», вы могли бы программно включить/отключить компонент «Receiver» через 'setComponentEnabledSetting()' PackageManager'. –

+3

Ответ Вакаса может быть наилучшим вариантом, если вы хотите, чтобы «Receiver» был жив, когда «Служба» работает. –

Смежные вопросы