Receptor de transmissão dentro de um serviço

90

Estou tentando iniciar a BroadcastReceiverdentro de a Service. O que estou tentando fazer é ter um plano de fundo em execução serviceque coleta as mensagens de texto recebidas e registra as ligações recebidas. Achei que a melhor maneira de fazer isso é ter um servicefuncionamento que incorpora um receptor de transmissão que pode catalogar qualquer um.

Como faço para fazer isso? Já tenho meu serviço instalado e funcionando.

Utopia025
fonte

Respostas:

127

como seu serviço já está configurado, basta adicionar um receptor de transmissão em seu serviço:

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

no seu serviço, onCreatefaça o seguinte:

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

e no seu serviço onDestroy:

unregisterReceiver(receiver);

e você está pronto para receber a transmissão de todos os filtros mencionados onCreate. Certifique-se de adicionar qualquer permissão, se necessário. por exemplo

<uses-permission android:name="android.permission.RECEIVE_SMS" />
waqaslam
fonte
Percebi que não consigo passar dados por intent.setData (myUri) ao enviar sendBroadcas (intent) e braoadcastReceiver não funciona nesse caso, está certo?
deadfish de
Estou um pouco confuso sobre o ciclo de vida do serviço quando tem BroadcastReceiver (no meu caso, baixe BroadcastReceiver)
Android Man
1
@waqaslam Você definiu este BroadcastReceiver em seu manifesto?
IgorGanapolsky
2
@IgorGanapolsky Não, você não precisa registrar esses receptores no manifesto.
waqaslam
2
@SayyedRizwan Seu serviço e BroadcastReceiver serão executados no mesmo processo e provavelmente no mesmo thread (a menos que você crie um novo). O consumo da bateria depende de como você definiu seu tópico (segundo plano / primeiro plano) e da quantidade de transmissões que chegam.
waqaslam
24

O melhor padrão é criar um autônomo BroadcastReceiver. Isso garante que seu aplicativo possa responder à transmissão, esteja ou não em Serviceexecução. Na verdade, usar esse padrão pode eliminar a necessidade de um funcionamento constante Service.

Registre o BroadcastReceiverem seu Manifesto e crie uma classe / arquivo separado para ele.

Por exemplo:

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

Quando o receptor é executado, você simplesmente passa um Intent( Bundle) para o Servicee responde a ele emonStartCommand() .

Por exemplo:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}
Paul Burke
fonte
6
Desejo que a transmissão esteja dentro do ciclo de vida do serviço, de forma que o app apenas consulte mensagens / ligações de acordo com a linha de tempo do serviço. Este método permite isso? parece que você o configurou de forma que a recepção da transmissão desligue o serviço.
Utopia025
Esta implementação iniciaria o Servicese ainda não estivesse em execução ou passaria um novo Intentse estiver (para recuperação em onStartCommand). Se você deseja que ele seja executado apenas quando o Serviceestiver ativo, você pode ativar / desativar programaticamente o Receivercomponente por meio do PackageManagerdo setComponentEnabledSetting().
Paul Burke
4
A resposta de Waqas pode ser sua melhor opção, se você só quer o Receivervivo quando o Serviceestá funcionando.
Paul Burke
3
Se você não tiver uma atividade, ela não funcionará para API 3.1 e superior: ashimita.blogspot.com.tr/2012/04/…
elif
1
A partir do Android 3.1, o sistema Android exclui todos os receptores de receber intents por padrão se o aplicativo correspondente nunca tiver sido iniciado pelo usuário ou se o usuário interromper explicitamente o aplicativo por meio do menu Android. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik