我有以下 GCM Intent 服务:
public class GCMIntentService extends GCMBaseIntentService {
private static final String TAG = "GCMIntentService";
private static int new_video_count;
WifiLock wifiLock = null;
@Override
protected void onError(Context context, String errorId) {
LogService.log(TAG, "Received error: " + errorId);
Utils.displayMessage(context, getString(R.string.gcm_error, errorId));
}
@Override
protected void onMessage(Context context, Intent intent) {
String message = getString(R.string.gcm_message);
LogService.log(TAG, "onMessage() : " + message);
try {
if (intent.hasExtra("message_text")) {
Log.d(TAG, "has data extra = " + intent.getStringExtra("message_text"));
message = intent.getStringExtra("message_text");
// TODO gcm notification should contain date element and parse
// it here
} else {
Log.d(TAG, "NO data extra message_text");
}
} catch (NullPointerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new_video_count = UserCredentialsPersistence.restoreNewVideoCount(getBaseContext()) + 1;
UserCredentialsPersistence.saveNewVideoCount(getBaseContext(), new_video_count);
Log.d(TAG, "new_video_count = " + new_video_count);
// send to activity
Utils.displayMessage(context, message);
// send to notification bar
generateNotification(context, message);
}
@Override
protected void onRegistered(Context context, String registrationId) {
LogService.log(TAG, "Device registered: regId = " + registrationId);
Utils.displayMessage(context, getString(R.string.gcm_registered));
Settings.System.putInt(getContentResolver(), Settings.System.WIFI_SLEEP_POLICY, Settings.System.WIFI_SLEEP_POLICY_NEVER);
WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL, "MyWifiLock");
if (!wifiLock.isHeld()) {
wifiLock.acquire();
LogService.log(TAG, "Device registered: wifilock aquired ");
}
}
@Override
protected void onUnregistered(Context context, String registrationId) {
LogService.log(TAG, "Device unregistered");
Utils.displayMessage(context, getString(R.string.gcm_unregistered));
if (wifiLock != null) {
if (wifiLock.isHeld()) {
wifiLock.release();
LogService.log(TAG, "Device registered: wifilock released ");
}
}
}
private static void generateNotification(Context context, String message) {
LogService.log(TAG, "generateNotification()");
ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
if (!componentInfo.getPackageName().equalsIgnoreCase(Constants.PACKAGE_NAME) || Constants.getNotif) {
Log.d(TAG, "generateNotification() show notification top bar");
int icon = R.drawable.icon;
long when = System.currentTimeMillis();
String title = "We";
Intent notificationIntent = new Intent(context, VideoHolderActivity.class);
notificationIntent.putExtra("video_id", "last_video");
notificationIntent.putExtra("fragment", "last_video");
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
Notification notification;
if (Build.VERSION.SDK_INT >= 16) {
notification = new Notification.Builder(context).setContentTitle(title).setContentText(message).setSmallIcon(icon).setContentIntent(intent).build();
} else {
notification = new Notification.Builder(context).setContentTitle(title).setContentText(message).setSmallIcon(icon).setContentIntent(intent).getNotification();
}
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.number = new_video_count;
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify((int) when, notification);
} else {
Log.w(TAG, "generateNotification() don't show notification top bar");
}
LogService.log(TAG, "generateNotification() new_video_count: " + new_video_count);
if (VibrationManager.getInstance(context).getVibrationEnabled()) {
playTone(context);
}
}
@Override
protected String[] getSenderIds(Context context) {
String[] ids = new String[1];
ids[0] = Constants.SENDER_ID;
return ids;// return super
}
private static void playTone(Context context) {
LogService.log(TAG, "playTone()");
try {
Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
Ringtone ringtone = RingtoneManager.getRingtone(context, notification);
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
if (!ringtone.isPlaying()) {
ringtone.play();
if (vibrator.hasVibrator()) {
vibrator.vibrate(300);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
现在,当收到一条消息时,它会生成一个通知,如果您不在应用程序中,如果您在应用程序中,它将使用以下命令显示一条消息:Utils.displayMessage(context, message);
执行以下操作:
public static void displayMessage(Context context, String message) {
Intent intent = new Intent(Constants.DISPLAY_MESSAGE_ACTION);
intent.putExtra(Constants.EXTRA_MESSAGE, message);
context.sendBroadcast(intent);
}
现在有时它起作用,有时它不起作用。如果我更改了我所在的片段,然后返回,它没有,它将检查通知,它会做需要做的事情。但是,我需要它是实时的。我没有收到通知的原因可能是什么?
编辑:另一件事,几分钟后,我开始收到通知,在此之前,logcat 向我显示:
06-17 15:54:38.581: I/GTalkService/c(760): [AndroidEndpoint@1099335768] connect: acct=1000000, state=CONNECTING
06-17 15:54:38.581: I/GTalkService/c(760): [GTalkConnection@1099531696] connect: acct=1, state=CONNECTING
这意味着什么?这不应该在我注册 GCM 后立即出现吗?