2016-03-01 3 views
0

Пожалуйста, мне нужна помощь. Мое приложение получает сообщения, когда приложение открыто или находится в фоновом режиме, но если я отключу устройство или принудительно закрываю приложение, все сообщения никогда не могут быть получены при перезапуске приложения. Я много читал, но ничего не нашел. Пожалуйста, есть мои занятия.GCM: не получать сообщения, когда устройство выключено

1 Кому-то пришлите мне сообщение. И я получаю сообщение.

2 Я заставляю закрыть приложение или выключить устройство.

3 Кто-то пришёл мне сообщение, но мое устройство выключено.

4 Я включил устройство и перезапустил приложение. Я не получаю никаких сообщений, но если кто-то пришлет мне новое сообщение, я получаю это сообщение.

Только в том случае, если приложение находится в фоновом режиме или спереди. Но когда я перезапущу приложение после того, как приложение будет убито, я не получаю сообщения от gcm.

Это ReceiverClass:

public class MSGReceiver extends WakefulBroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 

    Bundle extras = intent.getExtras(); 
    Intent msgrcv = new Intent("Msg"); 
    msgrcv.putExtra("msg", extras.getString("msg")); 
    msgrcv.putExtra("fromu", extras.getString("fromu")); 
    msgrcv.putExtra("fromname", extras.getString("name")); 

    if(extras.getString("fromu")!=null && extras.getString("msg")!=null){ 
     try{ 
      SharedPreferences blindDate = context.getSharedPreferences("datosblind",Context.MODE_PRIVATE); 
      ConexionSQLite conexion = new ConexionSQLite(context); 
      int id = Integer.parseInt(extras.getString("fromu")); 
      int idUser = Integer.parseInt(blindDate.getString("REG_FROM","")); 
      int order = conexion.getSize(id, idUser); 
      conexion.insertNewMessage(id, extras.getString("msg"), order+1, "false", idUser); 
      conexion.insertNewSize(id, order+1, idUser); 
     }catch(Exception e){} 
    } 

    LocalBroadcastManager.getInstance(context).sendBroadcast(msgrcv); 
    ComponentName comp = new ComponentName(context.getPackageName(),MSGService.class.getName()); 
    startWakefulService(context, (intent.setComponent(comp))); 
    setResultCode(Activity.RESULT_OK); 
    } 
} 

Это ServiceClass:

public class MSGService extends IntentService { 

SharedPreferences prefs; 
NotificationCompat.Builder notification; 
NotificationManager manager; 


public MSGService() { 
    super("MSGService"); 
} 

@Override 
protected void onHandleIntent(Intent intent) { 
    Bundle extras = intent.getExtras(); 
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 

    String messageType = gcm.getMessageType(intent); 
    prefs = getSharedPreferences("datosblind", 0); 


    if (!extras.isEmpty()) { 

     if (GoogleCloudMessaging. 
       MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
      Log.e("L2C","Error"); 

     } else if (GoogleCloudMessaging. 
       MESSAGE_TYPE_DELETED.equals(messageType)) { 
      Log.e("L2C","Error"); 

     } else if (GoogleCloudMessaging. 
       MESSAGE_TYPE_MESSAGE.equals(messageType)) { 

      if(!prefs.getString("CURRENT_ACTIVE","").equals(extras.getString("fromu"))) { 
       if(prefs.getInt("iniciadaLaSesion", 0)==1) 
        sendNotification(extras.getString("msg"), extras.getString("fromu"), extras.getString("name")); 
      } 
     } 
    } 
    MSGReceiver.completeWakefulIntent(intent); 
} 

private void sendNotification(String msg,String mobno,String name) { 

    Bundle args = new Bundle(); 
    args.putString("mobno", mobno); 
    args.putString("name", name); 
    args.putString("msg", msg); 
    Intent chat = new Intent(this, Conversacion.class); 
    chat.putExtra("INFO", args); 
    notification = new NotificationCompat.Builder(this); 
    notification.setContentTitle(name); 
    notification.setContentText(msg); 
    notification.setTicker("Blind Date: " + name); 
    notification.setSmallIcon(R.drawable.ic_launcher); 
    notification.setSound(Uri.parse("android.resource://" 
      + this.getPackageName() + "/" + R.raw.sonidonotificacion)); 

    PendingIntent contentIntent = PendingIntent.getActivity(this, 1000, 
      chat, PendingIntent.FLAG_CANCEL_CURRENT); 
    notification.setContentIntent(contentIntent); 
    notification.setAutoCancel(true); 
    manager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    manager.notify(Integer.parseInt(mobno), notification.build()); 
    } 
}              

Это проявляется:

<receiver 
     android:name="com.expansion.minlove.MSGReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 

      <category android:name="com.expansion.minlove" /> 
     </intent-filter> 
    </receiver> 

    <service android:name="com.expansion.minlove.MSGService" /> 

И это запрос сервера:

exports.send = function(fromn,fromu,to,msg,callback) { 
 

 
user.find({mobno: to},function(err,users){ 
 
var len = users.length; 
 
if(len == 0){ 
 
callback({'response':"Failure"}); 
 
}else{ 
 
\t var to_id = users[0].reg_id; 
 
\t var name = users[0].name; 
 

 
request(
 
    { method: 'POST', 
 
    uri: 'https://android.googleapis.com/gcm/send', 
 
    headers: { 
 
     'Content-Type': 'application/json', 
 
     'Authorization':'key=********mjxGkTrOnH6dE' 
 
    }, 
 
    body: JSON.stringify({ 
 
    "registration_ids" : [to_id], 
 
    "data" : { 
 
    "msg":msg, 
 
    "fromu":fromu, 
 
    "name":fromn 
 
    }, 
 
}) 
 
    } 
 
    , function (error, response, body) { 
 

 
\t callback({'response':"Success"}); 
 
    } 
 
) 
 
}}); 
 

 
}

Пожалуйста, мне нужна помощь. Я сойду с ума.

+0

вы можете добавить 'time_to_live' параметр в массиве JSON, чтобы обеспечить сообщение жив. – Dory

+0

Учитывая, что вы получаете сообщение в некоторых случаях, я бы предположил, что серверная сторона вещей прекрасна. На стороне клиента, если вы не получаете сообщения, когда ваше приложение закрыто, или когда вы перезагружаете свое устройство (каким вы должны быть), это, скорее всего, проблема с вашим боковым радиовещательным приемником. Я бы предложил использовать GcmListenerService для этого. Это рекомендуемый способ получения сообщений GCM на Android. См. Пример здесь: https://github.com/googlesamples/google-services/blob/master/android/gcm/app/src/main/java/gcm/play/android/samples/com/gcmquickstart/MyGcmListenerService.java –

ответ

0

Изменить на:

<intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <category android:name="com.example.gcm" /> 
      </intent-filter> 
+0

просто не работает ...: S :( –

Смежные вопросы