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

Oi,

Na classe ReceiverSMS tenho a seguinte codificação:

[code] @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);
    }
}[/code]

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

[code] 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);
  }[/code]

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!

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

[quote=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[/quote]

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!

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

Acho que o erro é outro. Posta o logCat

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

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

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.

[quote=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[/quote]

[quote=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[/quote]

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!

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

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

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?

[quote=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?[/quote]

Oi,

Ficou pior ainda! rs nem apareceu mais:

Activity.class:

[code] @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);
  }[/code]

ReceiverSMS:

[code]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);
// }
}
}[/code]

SMSHelper.class:

[code]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;
}

}[/code]

Tchauzin!

Aproveita e faz o teste somente iniciando a activity no broadcastReceiver

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

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!

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.

[quote=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.[/quote]

Oi,

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

Tchauzin!

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

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