Problemas para mantener vivo el mensaje de Google Cloud

Estoy tratando de resolver el problema de tiempo de gcm, hay muchos hilos en este tema, aquí es uno de referencia.

Una solución propuesta es difundir un par de intenciones en un intervalo más corto que el tiempo de espera tcp.

Mi implementación es crear una clase que extiende la clase CountDownTimer y mantener una instancia de esa clase en un servicio existente. Esta clase derivada se reinicia cuando se termina y el servicio está marcado como STICKY_START, así que una vez iniciado, creo que debería seguir difundiendo las intenciones cada 4 minutos, pero por alguna razón hay lagunas, cuando el contador no transmite el Intentos y yo todavía suelto contacto con el servidor de GCM.

Las dos clases relevantes están abajo. ¿Puede alguien explicar y ofrecer una solución de por qué esta estrategia no funciona?

He creado una clase que extiende CounDownTimer que debe difundir las intenciones cada 4 minutos.

public class GcmKeepAlive extends CountDownTimer { protected CountDownTimer timer; protected Context mContext; protected Intent gTalkHeartBeatIntent; protected Intent mcsHeartBeatIntent; public GcmKeepAlive(Context context) { super(4*60* 1000,4*60*1000); mContext = context; gTalkHeartBeatIntent = new Intent("com.google.android.intent.action.GTALK_HEARTBEAT"); mcsHeartBeatIntent = new Intent("com.google.android.intent.action.MCS_HEARTBEAT"); System.out.println("stariing heartbeat countdown timer"); this.start(); } @Override public void onTick(long millisUntilFinished) { } @Override public void onFinish() { System.out.println("sending heart beat to keep gcm alive"); mContext.sendBroadcast(gTalkHeartBeatIntent); mContext.sendBroadcast(mcsHeartBeatIntent); this.start(); } } 

Aquí está el servicio en mi aplicación que contiene una instancia de la clase GcmKeepAlive

Import android.app.Service; Import android.content.Intent; Import android.os.IBinder;

 public class LocationMonitorService extends Service { private DeviceLocationClient deviceLocationClient; private GcmKeepAlive gcmKeepAlive; @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); System.out.println("creating the LocationMonitorService"); deviceLocationClient = new DeviceLocationClient(this); gcmKeepAlive = new GcmKeepAlive(this); } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub System.out.println("inside service making request for location updates"); deviceLocationClient.requestLLocationUpdates(); gcmKeepAlive.start(); return START_STICKY; } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } } 

Aquí hay un ejemplo de una brecha como se ve en logcat.

 07-13 14:59:05.583 I/System.out(21651): sending heart beat to keep gcm alive 07-13 15:03:05.640 I/System.out(21651): sending heart beat to keep gcm alive 07-13 15:07:05.776 I/System.out(21651): sending heart beat to keep gcm alive 07-13 15:11:05.922 I/System.out(21651): sending heart beat to keep gcm alive 07-13 15:27:31.994 I/System.out(21651): sending heart beat to keep gcm alive 

De hecho, he resuelto esto hace algún tiempo, el reciente comentario de Erik Z me quedó para publicar mi solución.

He resuelto esto mediante la creación de una alarma recurrente que desencadena una emisión, que crea y transmite las intenciones. Los vacíos fueron causados ​​por el servicio original que se está matando y reiniciado como resultado del indicador START_STICKY.

Aquí están las varias partes (tiradas de varios archivos)

Esto fue necesario pre-kitkat por lo menos, no sé si todavía es necesario, supongo que lo es. No lo he apagado para confirmar sin embargo.


El administrador de alarmas, la intención y la intención pendiente.

 AlarmManager alarmManager = (AlarmManager) Context.getSystemService(Context.ALARM_SERVICE); Intent gcmKeepAliveIntent = new Intent("com.gmail.npnster.ourlatitude.gcmKeepAlive"); PendingIntent gcmKeepAlivePendingIntent = PendingIntent.getBroadcast(mContext, 0, gcmKeepAliveIntent, PendingIntent.FLAG_CANCEL_CURRENT); alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 1000, 4*60*1000, gcmKeepAlivePendingIntent); 

El receptor de la emisión:

 public class GcmKeepAliveBroadcastReceiver extends BroadcastReceiver { private GcmKeepAlive gcmKeepAlive; @Override public void onReceive(Context context, Intent intent) { MyLog.p(this,"inside gcm keep alive receiver"); gcmKeepAlive = new GcmKeepAlive(context); gcmKeepAlive.broadcastIntents(); } } 

La clase keep alive que envía las transmisiones vivas.

 public class GcmKeepAlive { protected Context mContext; protected Intent gTalkHeartBeatIntent; protected Intent mcsHeartBeatIntent; public GcmKeepAlive(Context context) { mContext = context; gTalkHeartBeatIntent = new Intent( "com.google.android.intent.action.GTALK_HEARTBEAT"); mcsHeartBeatIntent = new Intent( "com.google.android.intent.action.MCS_HEARTBEAT"); } public void broadcastIntents() { MyLog.p(this,"sending heart beat to keep gcm alive"); mContext.sendBroadcast(gTalkHeartBeatIntent); mContext.sendBroadcast(mcsHeartBeatIntent); } } 
  • Java.lang.ClassNotFoundException para mi aplicación
  • Los niños de Vista personalizada se null después de inflar la vista en Android
  • ¿Cómo exportan jarras de un proyecto de biblioteca a proyectos de referencia en Eclipse?
  • Cómo poner elementos anidados de archivo XML a la lista de objetos con VTD-XML parser?
  • Realizar N llamadas de api secuenciales usando RxJava y Retrofit
  • Animación de carga de Android
  • Transmitir vídeo en vivo desde la cámara en android
  • En una aplicación de Android, ¿debo tener un proveedor de contenido por tabla o sólo uno para toda la aplicación?
  • Cómo cambiar la cámara Android a la vertical en la vista de superficie?
  • ¿Cuál es el propósito de las anotaciones de @SmallTest, @MediumTest y @LargeTest en Android?
  • Realm.io notificaciones - ¿Cómo escuchar los cambios sólo en cierto cuadro?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.