[BroadcastReceiver] - Tempo de Duração [Resolvido]

20 respostas
lina

Oi,

Na classe ReceiverSMS tenho a seguinte codificação:

@Override
	public 
	void			onReceive
				(
					Context 		context, 
					Intent			intent
				) 
	{		
		Bundle 
		bundle			=	intent.getExtras();
		
		SmsMessage[] 
		msgs			=	null;
	    
		String 
		str			=	"";
	    
		if	(
				bundle 			!=	null
			) 
		{
			Object[] 
			pdus			=	(Object[]) bundle.get("pdus");
			msgs			=	new SmsMessage[pdus.length];
			
			for	(
					int 
					i			=	0
					;
					i			<	msgs.length
					;
					i++
				)
			{
				msgs[i]			=	SmsMessage.createFromPdu((byte[]) pdus[i]);
				str += "SMS from " + msgs[i].getOriginatingAddress();
				str += " :";
				str += msgs[i].getMessageBody().toString();
				str += "\n";
			}
			
			//Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
						
			Intent 
			mainActivityIntent 	=	new Intent(context, TesteActivity.class);
			mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
			context.startActivity(mainActivityIntent);
			
			Intent 
			broadcastIntent = new Intent();
			broadcastIntent.setAction("SMS_RECEIVED_ACTION");
			broadcastIntent.putExtra("sms", str);
			context.sendBroadcast(broadcastIntent);
	    }
	}

Realizo a chamada desta classe na minha Activity e sobrescrevo o método onReceive() desta maneira:

IntentFilter
	  intentFilter;
	  
	  @Override
	  public 
	  void			onCreate
	  			(
	  				Bundle			savedInstanceState
	  			)
	  {
		  super.onCreate(savedInstanceState);
		  setContentView(R.layout.teste);
		  intentFilter = new IntentFilter();
		  intentFilter.addAction("SMS_RECEIVED_ACTION");
		  
		  BroadcastReceiver	
		  intentReceiver	=	new BroadcastReceiver() 
		  {
			  @Override
			  public 
			  void			onReceive
			  			(
			  				Context			context, 
			  				Intent			intent
			  			)
			  {
				  TextView
				  ls_sms_view		=	(TextView)findViewById(R.id.io_txv_teste);
				  ls_sms_view.setText(intent.getExtras().getString("sms"));
			  }
		  };
		  registerReceiver(intentReceiver, intentFilter);
	  }

o SMS é recebido e interceptado. Porém o mesmo é apresentado em apenas poucos segundos. A principio, dura em tela 3 segundos. Passando estes 3 segundos, o que foi interceptado some, apresentando apenas o botão FECHAR.

O meu Manifest está dessa forma:

<receiver android:name=".ReceiverSMS" android:exported="true" >
	<intent-filter android:priority="999">		
		<action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
	</intent-filter>	
</receiver>
<uses-permission
	android:name="android.permission.SEND_SMS">
</uses-permission>
<uses-permission 
       	android:name="android.permission.RECEIVE_SMS">        
</uses-permission>
<uses-permission 
        android:name="android.permission.READ_SMS">
</uses-permission>

Alguém já viu algo parecido ?

Tchauzin!

20 Respostas

A

Ola
Coloca o tratamento do textView em um metodo na activity
Passa o string do getExtra como parametro
O onReceive tem dez seg para terminar

lina

A H Gusukuma:
Ola
Coloca o tratamento do textView em um metodo na activity
Passa o string do getExtra como parametro
O onReceive tem dez seg para terminar

Oi,

Se eu criar um método e chama-lo de dentro do onReceive() não seria mesma coisa ? Quando passar 10 segundos irá “matar” o método automaticamente?!

Tchauzin!

A

Não porque o metodo vai encerrar antes e ao encerrar vai encerrar o onReceive

A

Acho que o erro é outro. Posta o logCat

felipebonezi

O erro é exatamente o problema de tempo de processamento do BroadcastReceiver.

Basicamente você deveria criar o seu BroadcastReceiver para interceptar o SMS passando uma PedingIntent para abrir essa mensagem quando for criado um Notification por exemplo.

Eu tenho um exemplo de SMS, se quiser dar uma olhada segue o link do meu blog: http://debugcodigos.blogspot.com.br/2011/09/como-enviar-sms-pelo-android.html

A

Está parecendo travamento da UI Thread
Agora se for para alterar o pgm, por que não passa os dados do sms no start da activity?
Nem precisa do broadcast
Mas eu concordo com o Felipe, não se inicia activity diretamente via broadcastreceiver

C_k

Fatttooo ! BroadcastReceiver não dura muito tempo eu particularmente utilizo apenas para inicar os programas com Android.
Ele tem que utilizar um serviço que mata o problema.

felipebonezi:
O erro é exatamente o problema de tempo de processamento do BroadcastReceiver.

Basicamente você deveria criar o seu BroadcastReceiver para interceptar o SMS passando uma PedingIntent para abrir essa mensagem quando for criado um Notification por exemplo.

Eu tenho um exemplo de SMS, se quiser dar uma olhada segue o link do meu blog: http://debugcodigos.blogspot.com.br/2011/09/como-enviar-sms-pelo-android.html

lina

felipebonezi:
O erro é exatamente o problema de tempo de processamento do BroadcastReceiver.

Basicamente você deveria criar o seu BroadcastReceiver para interceptar o SMS passando uma PedingIntent para abrir essa mensagem quando for criado um Notification por exemplo.

Eu tenho um exemplo de SMS, se quiser dar uma olhada segue o link do meu blog: http://debugcodigos.blogspot.com.br/2011/09/como-enviar-sms-pelo-android.html

Oi,

Então… eu não entendi direito esse tutorial! Já tinha lido antes de fazer a pergunta aqui.

O Fato é que estou recebendo uma mensagem de um outro aparelho.

Até então só achei uma saída: Criar uma Thread e executar seu start dentro do onReceive(). Ele mostrara o SMS na Activity (como tem que mostrar) e ficará em WAIT(). O botão FINALIZAR presente nesta mesma Activity fará o notify() da mesma, forçando a sua interrupção. Se isso irá funcionar, só Deus sabe.

Tchauzin!

A

Faz um teste da sua activity como uma launcher
Veja como ele se comporta

A

A maioria acha que o problema está no broadcastReceiver, eu não vejo código suficiente para bloquear o onReceive
Então deve ter mais código na sua activity que está bloqueando a Ui Thread
Verifica isso

felipebonezi

Quem vai inicializar a sua Activity com a mensagem é a Notificação! :slight_smile:

Por isso o seu BroadcastReceiver tem um Intent-Filter com uma Action chamanda SMS_RECEIVE !!

Quando receber, seu broadcast é acionado e nele inicializa a Notification com uma PedingIntent para a sua Activity, ou seja, quando ele clicar na Notificação a Activity será aberta e você passa a mensagem como parâmetro na Intent ou então no próprio Broadcast você guarda em um banco de dados que quando a Activity for inicializa ele lê o SMS do banco.

Entendeu?

lina
felipebonezi:
Quem vai inicializar a sua Activity com a mensagem é a Notificação! :)

Por isso o seu BroadcastReceiver tem um Intent-Filter com uma Action chamanda SMS_RECEIVE !!

Quando receber, seu broadcast é acionado e nele inicializa a Notification com uma PedingIntent para a sua Activity, ou seja, quando ele clicar na Notificação a Activity será aberta e você passa a mensagem como parâmetro na Intent ou então no próprio Broadcast você guarda em um banco de dados que quando a Activity for inicializa ele lê o SMS do banco.

Entendeu?

Oi,

Ficou pior ainda! rs nem apareceu mais:

Activity.class:

@Override
	  public 
	  void			onCreate
	  			(
	  				Bundle			savedInstanceState
	  			)
	  {
		  super.onCreate(savedInstanceState);
		  setContentView(R.layout.teste);
		  intentFilter = new IntentFilter();
		  intentFilter.addAction("SMS_RECEIVED_ACTION");
		  
		  BroadcastReceiver	
		  intentReceiver	=	new BroadcastReceiver() 
		  {
			  @Override
			  public 
			  void			onReceive
			  			(
			  				Context			context, 
			  				Intent			intent
			  			)
			  {
				  TextView
				  ls_sms_view		=	(TextView)findViewById(R.id.io_txv_text);
				  ls_sms_view.setText(intent.getExtras().getString("sms"));
			  }
		  };
		  registerReceiver(intentReceiver, intentFilter);
	  }

ReceiverSMS:

public class		ReceiverSMS
	extends		BroadcastReceiver
{
	@Override
	public 
	void			onReceive
				(
					Context 		context, 
					Intent			intent
				) 
	{
		SmsMessage message = SMSHelper.getMessagesFromIntent(intent)[0];
		
		Toast.makeText(context, message.getMessageBody(), Toast.LENGTH_SHORT).show();
		
//		Bundle 
//		bundle			=	intent.getExtras();
//		
//		SmsMessage[] 
//		msgs			=	null;
//	    
//		String 
//		str			=	"";
//	    
//		if	(
//				bundle 			!=	null
//			) 
//		{
//			Object[] 
//			pdus			=	(Object[]) bundle.get("pdus");
//			msgs			=	new SmsMessage[pdus.length];
//			
//			for	(
//					int 
//					i			=	0
//					;
//					i			<	msgs.length
//					;
//					i++
//				)
//			{
//				msgs[i]			=	SmsMessage.createFromPdu((byte[]) pdus[i]);
//				str += "SMS from " + msgs[i].getOriginatingAddress();
//				str += " :";
//				str += msgs[i].getMessageBody().toString();
//				str += "\n";
//			}
//			
//			//Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
//						
//			Intent 
//			mainActivityIntent 	=	new Intent(context, ActivityPrincipal.class);
//			mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//			context.startActivity(mainActivityIntent);
//			
//			Intent 
//			broadcastIntent = new Intent();
//			broadcastIntent.setAction("SMS_RECEIVED_ACTION");
//			broadcastIntent.putExtra("sms", str);
//			context.sendBroadcast(broadcastIntent);
//	    }
	}
}

SMSHelper.class:

public class SMSHelper
{

	public static SmsMessage[] getMessagesFromIntent(Intent intent)
	{
		Object[] pdusExtras = (Object[])intent.getSerializableExtra("pdus");

		SmsMessage[] messages = new SmsMessage[pdusExtras.length];

		for (int i = 0; i < pdusExtras.length; i++) {

			  messages[i] = SmsMessage.createFromPdu((byte[])pdusExtras[i]);

			}
		
		return messages;
	}

}

Tchauzin!

A

Aproveita e faz o teste somente iniciando a activity no broadcastReceiver

felipebonezi

Você registrou no seu AndroidManifest que o Broadcast tem um Intent-Filter com a ACTION padrão de SMS_RECEIVED ?

lina

Oi,

I guess so:

<receiver android:name=".ReceiverSMS" android:exported="true" > <intent-filter android:priority="999"> <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> </intent-filter> </receiver>

Tchauzin!

felipebonezi

EM sua activity vocÊ está registrando outro BroadcastReceiver ao invez do SMSReceiver.

Você está fazendo alguma coisa errada que está conflitando.
Comece do zero… Acho que vai ser melhor.

lina

felipebonezi:
EM sua activity vocÊ está registrando outro BroadcastReceiver ao invez do SMSReceiver.

Você está fazendo alguma coisa errada que está conflitando.
Comece do zero… Acho que vai ser melhor.

Oi,

As minhas classes estão exatamente como eu postei no meu ultimo post. Sem nenhuma mudança…

Tchauzin!

A

Olá
Testou o start da activity?
É só tirar os comentários e testar

A

Só mais uma tentativa!
Quando apareceu o FECHAR qual a classe que mostrou?

lina

Oi,

Achei o erro.

Na classe ReceiverSMS estava iniciando por uma segunda vez a Activity:

@Override
	public 
	void			onReceive
				(
					Context 		context, 
					Intent			intent
				) 
	{		
		Bundle 
		bundle			=	intent.getExtras();
		
		SmsMessage[] 
		msgs			=	null;
	    
		String 
		str			=	"";
	    
		if	(
				bundle 			!=	null
			) 
		{
			Object[] 
			pdus			=	(Object[]) bundle.get("pdus");
			msgs			=	new SmsMessage[pdus.length];
			
			for	(
					int 
					i			=	0
					;
					i			<	msgs.length
					;
					i++
				)
			{
				msgs[i]			=	SmsMessage.createFromPdu((byte[]) pdus[i]);
				str += "SMS from " + msgs[i].getOriginatingAddress();
				str += " :";
				str += msgs[i].getMessageBody().toString();
				str += "\n";
			}
			
			//Toast.makeText(context, str, Toast.LENGTH_SHORT).show();

// Bastava tirar isso!						
//			Intent 
//			mainActivityIntent 	=	new Intent(context, TesteActivity.class);
//			mainActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//			context.startActivity(mainActivityIntent);
			
			Intent 
			broadcastIntent = new Intent();
			broadcastIntent.setAction("SMS_RECEIVED_ACTION");
			broadcastIntent.putExtra("sms", str);
			context.sendBroadcast(broadcastIntent);
	    }
	}

Agradeço a ajuda!!!

Tchauzin!

Criado 26 de março de 2012
Ultima resposta 28 de mar. de 2012
Respostas 20
Participantes 4