Android GCM:设备空闲时不发送通知。

Posted

技术标签:

【中文标题】Android GCM:设备空闲时不发送通知。【英文标题】:Android GCM: not sending notification when device is idle. 【发布时间】:2013-06-17 17:49:59 【问题描述】:

当我的设备空闲时,没有收到 GCM 通知。当设备被唤醒时,它们都会同时出现。以下是将消息发送到 GCM 的代码:

Sender sender = new Sender(API_KEY);
Message message = new Message.Builder().addData("type","newRequest").delayWhileIdle(false).build();
MulticastResult results = sender.send(message, devices, 5);

这是我的 GCMIntentService 类:

公共类 GCMIntentService 扩展 GCMBaseIntentService

public static final String SENDER_ID = "XXXXXXXXXXXXX";

public GCMIntentService()
    super(SENDER_ID);


@Override
protected void onError(Context context, String errorId) 
    // TODO Auto-generated method stub


@Override
protected void onMessage(Context context, Intent intent) 
    // TODO Auto-generated method stub
    WakeLocker.acquire(context);
    NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    long when = System.currentTimeMillis();
    int icon = R.drawable.ic_dialog_info;

    Intent notificationIntent = new Intent(this, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(this,0, notificationIntent, 0);
    Notification noti = new NotificationCompat.Builder(this)
            .setWhen(when).setContentTitle("New Storage Request")
            .setContentText("Touch to open app")
            .setSmallIcon(icon)
            .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
            .setTicker("New Storage Request").setAutoCancel(true)
            .setContentIntent(contentIntent)
            .getNotification();

    mNotificationManager.notify(0, noti);


@Override
protected void onRegistered(Context context, String regId) 
    // TODO Auto-generated method stub

    RestClient client = new RestClient(StorageApp.STORAGE_HOST+"StorageWebService/rest/operations/registerForGCM");
    client.AddParam("regId", regId);

    try 
        client.Execute(RequestMethod.GET);
     catch (Exception e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    

    System.out.println("done with call");


@Override
protected void onUnregistered(Context context, String regId) 
    // TODO Auto-generated method stub
    RestClient client = new RestClient(StorageApp.STORAGE_HOST+"StorageWebService/rest/operations/unregisterForGCM");
    client.AddParam("regId", regId);

    try 
        client.Execute(RequestMethod.GET);
     catch (Exception e) 
        // TODO Auto-generated catch block
        e.printStackTrace();
    



WakeLocker 是这个答案中描述的代码:

android AlarmManager not waking phone up

【问题讨论】:

您的设备是否仅支持 WiFi? 是的,它是一个媒体播放器 【参考方案1】:

只有当设备具有移动数据连接(例如手机)时,GCM 才能将消息传送到处于睡眠模式的设备。对于仅支持 WiFi 的设备,如果设备进入睡眠状态,则不会传递 GCM 消息,直到设备唤醒设备,时间足够长,设备选择重新连接到 WiFi。

【讨论】:

不完全正确。我开发了一个仅在 Wi-Fi 设备上运行的应用程序,它将接收 GCM 消息,尽管这似乎是间歇性的。我把一个设备关了一夜,然后第二天早上给它发了消息,它就收到了。在您撰写本文时,可能没有唤醒旧版本的 Google Play 服务。如果设备处于睡眠模式,当前版本似乎每 15 分钟唤醒一次设备,但如果用户将其退出睡眠模式,则会切换到永久连接。 看起来是这样,它应该这样做。答案还不够老,不能同意这种说法。如果设备处于睡眠状态,Google 设备管理器如何通过自己的服务调用设备? @CommonsWare :我在 FCM 中遇到了同样的问题。请给我解决方案【参考方案2】:

在服务器端代码中,请检查您在 delayWhileIdle() 方法中传递的值。让它假。它会起作用的。

【讨论】:

默认为false,无需设置!【参考方案3】:

棉花糖请看这个:

https://developer.android.com/training/monitoring-device-state/doze-standby.html#using_gcm

GCM 经过优化,可通过高优先级 GCM 消息与 Doze 和 App Standby 空闲模式一起使用。

【讨论】:

以上是关于Android GCM:设备空闲时不发送通知。的主要内容,如果未能解决你的问题,请参考以下文章

应用程序完全关闭时不出现 Android 推送通知(使用 node-gcm)

如果 Android 设备长时间处于空闲状态,则不会收到推送通知

如何通过 GCM 通过 Windows azure 为特定的 android 设备发送通知?

为啥 GCM 不在 android 设备中提供推送通知?

在哪个事件中,我可以使用 PushSharp 获取 GCM 响应以向 Android 设备发送通知?

适用于 Android 谷歌云消息 (GCM) 的 Azure 移动服务从不向设备发送通知