Pessoal preciso de uma ajuda de voces, o seguinte, criei um servico que se inicia com o boot do Android que acessa um webservice, verifica se tem novas OSs relacionadas ao IMEI do aparelho e se tiver dispara a Notificacao. Funciona, mas quando o cara abre o alerta o servico para, ontem fiz mais um teste, reiniciei o celular com servicos de dados ativados, a notificacao funcionou, abri o alerta e o servico parou, o servico só retornou a mostrar a notificacao depois de 3 horas. Se alguem puder dar uma ajuda para descobrir agradeceria, e tenho certeza que o codigo abaixo sera util para muitos outros tambem.
Segue o codigo:
IniciarServico.java
package com.br.notificacao;
import java.util.Calendar;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class IniciarServico extends BroadcastReceiver {
@Override
public void onReceive(Context contexto, Intent intent) {
// aqui o servico teria que verificar a cada 15 segundos - somente para teste
agendar(contexto, 15);
}
// Agenda o alarme/serviço para executar daqui a X segundos
private void agendar(Context contexto, int segundos) {
Intent it = new Intent("VERIFICA_OS");
PendingIntent p = PendingIntent.getService(contexto, 0, it, 0);
Calendar c = Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis());
c.add(Calendar.SECOND, segundos);
AlarmManager alarme = (AlarmManager) contexto.getSystemService(Context.ALARM_SERVICE);
long tempo = c.getTimeInMillis();
alarme.set(AlarmManager.RTC_WAKEUP, tempo, p);
}
}
Notificacao.java
package com.br.notificacao;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.IBinder;
import android.telephony.TelephonyManager;
import android.util.Log;
public class Notificacao extends Service {
private final String CATEGORIA = "SYSTEMCAR";
private static final String SOAP_ACTION_GET = "http://tempuri.org/GetNewOS";
private static final String METHOD_NAME_GET="GetNewOS";
private static final String NAMESPACE="http://tempuri.org/";
private static final String URL="http://www.site.com.br/servico.asmx";
// destroy o alerta no TB_ALERTANDROID
private static final String SOAP_ACTIONGET = "http://tempuri.org/UpdateGetNewOS";
private static final String METHOD_NAMEGET="UpdateGetNewOS";
String codimei = "";
@Override
public IBinder onBind(Intent intent){
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onStart(Intent intent, int startId){
super.onStart(intent, startId);
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
codimei = telephonyManager.getDeviceId();
Verificar(telephonyManager.getDeviceId());
}
private void Verificar(String imei)
{
new Thread(){
@Override
public void run(){
SoapObject request = new SoapObject (NAMESPACE, METHOD_NAME_GET);
request.addProperty("imei", codimei);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
try
{
HttpTransportSE httpTransport = new HttpTransportSE(URL);
httpTransport.call(SOAP_ACTION_GET, envelope);
//Resultado
SoapPrimitive resultado = (SoapPrimitive)envelope.getResponse();
String resultadoachei = resultado.toString();
if ( resultadoachei != ""){
// ............... aqui ele cria a Notificacao se tiver OS aberta para o IMEI do aparelho
criarNotificacao();
}
}
catch (Exception e)
{
Log.e(CATEGORIA, e.getMessage(), e);
}
}
}.start();
}
@Override
public void onDestroy(){
super.onDestroy();
}
protected void criarNotificacao() {
String mensagemBarraStatus = "Nova Ordem de Serviço.";
String titulo = "Ordem de Serviço";
String mensagem = "Existe uma nova ordem de servico!Verifique o sistema.";
Class<?> activity = DetalhesNotificacao.class;
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notificaction = new Notification(R.drawable.icon,
mensagemBarraStatus, System.currentTimeMillis());
notificaction.defaults |= Notification.DEFAULT_LIGHTS;
notificaction.ledARGB = Color.MAGENTA;//0xff00ff00;
notificaction.ledOnMS = 300;
notificaction.ledOffMS = 1000;
notificaction.flags |= Notification.FLAG_SHOW_LIGHTS;
notificaction.flags |= Notification.FLAG_INSISTENT;
notificaction.flags |= Notification.FLAG_AUTO_CANCEL;
Intent intentMensagem = new Intent(this, activity);
intentMensagem.putExtra("resultadu", "funcionou!?");
PendingIntent p = PendingIntent.getActivity(this, 0, intentMensagem, 0);
notificaction.setLatestEventInfo(this, titulo,
mensagem, p);
notificaction.vibrate = new long[] { 100, 250, 100, 1000 };
notificationManager.notify(R.string.app_name, notificaction);
}
}
MensagemAlerta.java
package com.br.notificacao;
public class MensagemAlerta {
private CharSequence title;
private CharSequence body;
private CharSequence subTitle;
public MensagemAlerta(CharSequence title, CharSequence body,
CharSequence subTitle) {
this.title = title;
this.body = body;
this.subTitle = subTitle;
}
public CharSequence getTitle() {
return title;
}
public void setTitle(CharSequence title) {
this.title = title;
}
public CharSequence getBody() {
return body;
}
public void setBody(CharSequence body) {
this.body = body;
}
public CharSequence getSubTitle() {
return subTitle;
}
public void setSubTitle(CharSequence subTitle) {
this.subTitle = subTitle;
}
}
DetalhesNotificacao.java
package com.br.notificacao;
import android.app.Activity;
import android.app.NotificationManager;
import android.content.pm.PackageManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.Toast;
public class DetalhesNotificacao extends Activity{
@Override
protected void onCreate(Bundle icicle){
super.onCreate(icicle);
// Cancela a notificacao
NotificationManager notification = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// utiliza o mesmo id que foi utilizado para criar
notification.cancel(R.string.app_name);
PackageManager packageManager = getPackageManager();
String packageName = "nome.do.pacote";
Intent intent = packageManager.getLaunchIntentForPackage(packageName);
if(null != intent){
startActivity(intent);
}
}
}
AndroidManifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.br.notificacao"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<!-- executa ao terminar a inicializacao (boot) do sistema operacional -->
<receiver android:name=".IniciarServico">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
<service android:name=".Notificacao">
<intent-filter>
<action android:name="VERIFICA_OS" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
<activity android:name="DetalhesNotificacao"></activity>
</application>
</manifest>
Entao como eu disse, ele funciona, mas nao sei porque depois que abre o alerta ele nao exibe mais e só depois de 3 horas que volta mostrar a notificacao. Sendo que eu queria que pelo menos a cada 1 minuto fizesse a verificacao do webservice e mostrasse a notificacao.
Por enquanto agradeco .