在App正在运行或在后台运行之前,GCM消息才会到达

时间:2015-08-15 19:48:57

标签: android google-cloud-messaging

我已成功实施GCM,当应用处于运行状态和后台状态时,消息已成功到达我的设备。

但是当应用程序处于关闭状态时,某些设备会收到消息,而有些设备则不会。要获得消息,我必须再次启动应用程序。

清单:                         

<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" />

<!-- Creates a custom permission so only this app can receive its messages. -->
<permission
    android:name="com.example.hp.abcd.permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

<uses-permission android:name="com.example.hp.abcd.permission.C2D_MESSAGE" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <activity
        android:name=".Splash"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>


    <activity
        android:name=".RegisterActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="com.example.hp.abcd.REGISTER" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity
        android:name=".Subject"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="com.example.hp.abcd.Subject" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

    <activity
        android:name=".MainActivity"
        android:configChanges="orientation|keyboardHidden"
        android:label="@string/app_name" >
    </activity>

    <activity
        android:name=".Message"
        android:label="@string/app_name" >

    <intent-filter>
        <action android:name="com.example.hp.abcd.MESSAGE" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    </activity>



    <receiver
        android:name="com.example.hp.abcd.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.hp.abcd" />
        </intent-filter>
    </receiver>

    <service android:name=".GCMNotificationIntentService" />
</application>

广播接收器:

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.WakefulBroadcastReceiver;
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    // Waking up mobile if it is sleeping
    ComponentName comp = new ComponentName(context.getPackageName(),
            GCMNotificationIntentService.class.getName());
    startWakefulService(context, (intent.setComponent(comp)));
    setResultCode(Activity.RESULT_OK);

}

GCMNotificationIntent service

import android.app.IntentService;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.google.android.gms.gcm.GoogleCloudMessaging;

import java.text.SimpleDateFormat;
import java.util.Calendar;

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();
    String msg = intent.getStringExtra("message");

    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(""
                    + extras.get(Config.MESSAGE_KEY));
            Log.i(TAG, "Received: " + extras.toString());
        }
    }
    GcmBroadcastReceiver.completeWakefulIntent(intent);
}

private void sendNotification(String msg) {
    DatabaseHandler db = new DatabaseHandler(this);
    Uri soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    Log.d(TAG, "Preparing to send notification...: " + msg);
    mNotificationManager = (NotificationManager) this
            .getSystemService(Context.NOTIFICATION_SERVICE);
    Calendar c = Calendar.getInstance();
    SimpleDateFormat d = new SimpleDateFormat("dd MMMM,yyyy");
    SimpleDateFormat t = new SimpleDateFormat("HH:mm");
    String strDate = d.format(c.getTime());
    String strTime = t.format(c.getTime());

    db.addContact(new Contact(msg, strDate, strTime));


     PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            new Intent(this, Message.class), 0);


    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            this).setSmallIcon(R.drawable.gcm_logo)
            .setContentTitle("India")
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg))
            .setContentText(msg)
            .setSound(soundUri);
    mBuilder.setAutoCancel(true);

    mBuilder.setContentIntent(contentIntent);
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());
    Log.d(TAG, "Notification sent successfully.");
}
}

0 个答案:

没有答案