¿El mensaje GCM no se envía cuando la aplicación no está abierta?
Recientemente implementé el GCM en mi aplicación. Seguí el código tutorial en este sitio web
http://javapapers.com/android/google-cloud-messaging-gcm-for-android-and-push-notifications/
Sin embargo, el comportamiento es bastante extraño, por ejemplo
Si elimino la aplicación, cuando envíe la notificación, no se mostrará en la barra de notificaciones de inmediato, pero solo cuando el usuario abra la aplicación nuevamente, por ejemplo, si envío dos notificaciones cuando elimine la aplicación, solo recibiré dos notificaciones cuando abro la aplicación.
¿Es el comportamiento de GCM? Como espero que sea algo así como WhatsApp (incluso si no abrí la aplicación, el dispositivo aún debería recibir la notificación y la pantalla)
Aquí está mi código. Gracias por ayudar
GcmBroadcastReceiver
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ComponentName comp = new ComponentName(context.getPackageName(),
GCMNotificationIntentService.class.getName());
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
GCMNotificationIntentService
public class GCMNotificationIntentService extends IntentService {
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
public GCMNotificationIntentService() {
super("GcmIntentService");
}
public static final String TAG = "GCMNotificationIntentService";
@Override
protected void onHandleIntent(Intent intent) {
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
String messageType = gcm.getMessageType(intent);
if (!extras.isEmpty()) {
if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
sendNotification("Send error: " + extras.toString());
} else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) {
sendNotification("Deleted messages on server: " + extras.toString());
} else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) {
for (int i = 0; i < 3; i++) {
Log.i(TAG, "Working... " + (i + 1) + "/5 @ " + SystemClock.elapsedRealtime());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
}
Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
sendNotification(getResources().getString(R.string.gcm_news_remind));
Log.i(TAG, "Received: " + extras.toString());
}
}
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
private void sendNotification(String msg) {
Log.d(TAG, "Preparing to send notification...: " + msg);
mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, SplashScreen.class), 0);
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
this).setSmallIcon(R.drawable.ic_launcher)
.setContentTitle(getResources().getString(R.string.app_name))
.setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
.setContentText(msg);
mBuilder.setContentIntent(contentIntent);
mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
Log.d(TAG, "Notification sent successfully.");
}
}
Manifiesto
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.oshpedia"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.example.oshpedia.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<permission
android:name="com.example.oshpedia.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="19" />
<application
android:name=".Defination.MyApp"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/AppTheme" >
<activity
android:name=".Activity.SplashScreen"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".Activity.Main"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustPan" >
</activity>
<activity
android:name=".Activity.AboutUs"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".Activity.AboutApp"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".Activity.Disclaimer"
android:screenOrientation="portrait" >
</activity>
, <activity
android:name=".Activity.EnquiryForm"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustPan" >
</activity>
<activity
android:name=".Activity.NewsDetail"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".Activity.EnquiryDetail"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".Activity.SearchResult"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".Activity.LawDetail"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".Activity.AdvanceSearch"
android:screenOrientation="portrait" >
</activity>
<activity
android:name=".Activity.VideoChannel"
android:screenOrientation="portrait" >
</activity>
<activity android:name=".Activity.VideoViewer" >
</activity>
<receiver
android:name=".GCM.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.example.oshpedia" />
</intent-filter>
</receiver>
<service android:name=".GCM.GCMNotificationIntentService" />
</application>
</manifest>