在 Android 上使用 GCM 推送通知

Posted

技术标签:

【中文标题】在 Android 上使用 GCM 推送通知【英文标题】:Push Notifications using GCM on Android 【发布时间】:2013-03-26 09:25:56 【问题描述】:

我正在尝试在我的 android 应用上实现推送通知。因此,没有比 Google 开发者页面更好的起点了。

我正在尝试在这里学习本教程:GCM Demo App。教程建议使用通过 SDK 管理器提供的示例代码。这样做并尝试发送推送通知后,当应用程序运行时,我在屏幕上看到正在写入新推送已到达。

但是,当应用程序处于后台或未运行时,我不会收到推送 通知。如果我打开应用程序,消息会再次显示在屏幕上。但是我从来没有收到任何以弹出窗口和声音通知的形式。

我是否必须在 android 中手动执行此操作?我认为它类似于 ios 平台负责向您显示通知。

有什么想法可以实现吗?

【问题讨论】:

给你看代码?从提供的链接下载它。我没有改变任何东西,除了我的项目 id ...... 我对此很陌生,但是如果应用程序不在前台,是否可能需要一些时间才能收到通知? 您收到设备成功添加的消息,然后当您的演示应用程序在后台时没有收到通知?对吗? @android 开发者如果设备在线,可能需要几分钟,但我从来没有看到需要几小时 android 开发者不,没有这种情况。 @Yahor10 没错。我不知道这是否有任何区别,但我实际上并没有使用给定的服务器。代替服务器 url 我放了一个假 url ,它尝试 5 次连接到该服务器以注册令牌并失败。然后从我的 php 脚本发送通知,然后我描述的事情发生了 【参考方案1】:

但我从来没有收到任何以弹出式通知形式出现的信息 声音。

可以在触发通知时将声音编程到代码中。像这样说。

Notification notification = new Notification(icon, tickerText, when);
notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

但是,当应用程序处于后台或未运行时,我不会收到推送通知

我是否必须在 android 中手动执行此操作?我以为会 类似于 iOS,平台负责向您展示 通知。

您的应用总是发送 GCM 数据(推送通知)。如何处理这些数据取决于您。 GCM 意图服务负责向您提供数据,仅此而已。您将需要使用通知服务向用户显示适当的通知。

这种方法有优点/缺点。当您收到推送通知时,应用程序代码将在 android 上运行,而在 iPhone 上则不然。您还可以根据推送通知的类型灵活地静默更新或通知用户。

在您的应用启动时使用发件人 ID 注册您的设备,您应该会收到预期的通知。所有推送通知都将发送到您选择的 GCMIntentService 上的此方法 protected void onMessage(Context context, Intent intent)

【讨论】:

你能帮我解决它吗?我需要通知显示并播放声音。这两行是我应该实现的所有代码? 它比这更复杂一些。要发送通知,请查看此问题中的代码 - ***.com/questions/7040742/… 至于弹出通知,您可以将 GCM 消息传递给注册到您的活动的 BroadcastReceiver,然后可以显示警报对话框。警报对话框的示例代码 - mkyong.com/android/android-alert-dialog-example @DeepakBala 您的回答说明了有关 android 上的静默通知。我正在研究 Android 的静默推送通知,如果用户已经登录到应用程序。应用需要知道它订阅了频道。然而,用户不需要被任何通知所困扰。你知道我该怎么做吗? @AtharvaPuranik 是的。跟踪活动对用户是可见还是不可见,并在接收 GCM 消息的类上使用此标志来决定是否应生成通知。我公司为 2 路应用内消息收件箱制作的 android sdk 上提供了一个工作示例 - github.com/deepak-bala/konotor-android。回购没有代码,但如果你创建一个问题,我可以分享一个 sn-p。 @DeepakBala 这是我新发布的问题的链接:***.com/questions/29305176/… 谢谢!【参考方案2】:

尝试取消注册并重新注册您的设备。 在 DemoActivity.java 中放

final String regId = GCMRegistrar.getRegistrationId(this);
        GCMRegistrar.unregister(this);

然后,在第二次启动时删除GCMRegistrar.unregister(this);

更新

您的应用程序中的通知:

创建类

public class DemoApplication extends Application 

    private class NotifyReceiver extends BroadcastReceiver

        @Override
        public void onReceive(Context context, Intent intent) 
              Toast.makeText(context, "RECEIVE MESSAGE", Toast.LENGTH_SHORT).show();
        
    

    private NotifyReceiver notifyReceiver = new NotifyReceiver();

    @Override
    public void onCreate() 
        registerReceiver(notifyReceiver, new IntentFilter("GCM_MESSAGE"));
        super.onCreate();
    

    @Override
    public void onTerminate() 
        unregisterReceiver(notifyReceiver);
        super.onTerminate();
    

然后放

<application
           android:name=".DemoApplication"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" > 

在 AndroidManifest.xml 中并在

中发送广播
  @Override
    protected void onMessage(Context context, Intent intent) 
        Log.i(TAG, "Received message");
        String message = getString(R.string.gcm_message);
        displayMessage(context, message);
      context.sendBroadcast(new Intent("GCM_MESSAGE"));
        // notifies user
        generateNotification(context, message);
    

作为替代情况,您可以在 Manifest、Activity 或 ForeGround 服务中注册广播接收器

【讨论】:

为什么?你有什么想法,你认为这会有所帮助吗?即使它有帮助也不会很可怕,记住这将是一个生产应用程序并且推送不起作用?! 当你在你的服务器上编辑错误的注册时应该不会害怕。这不会在生产应用程序中发生 为什么注册不正确?如果 10000 个用户注册不正确会怎样?他们永远不会收到我的通知? 用第三方服务器监控你的用户,当10000个用户长时间空闲你应该通知他gcm服务错误 我认为你听错了。我收到消息......当我打开应用程序时,所有消息都在那里......问题是我没有在通知中得到它。没有弹出窗口和声音通知用户。我描述的消息在那里,它会在一秒钟内出现,但没有通知气泡。

以上是关于在 Android 上使用 GCM 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GCM 在 android 设备上分别显示每个推送通知

使用 GCM、PHP 和 MySQL 的 Android 推送通知

避免在 Android 中使用通知推送从 GCM 显示自动通知

有时一些 android 用户没有通过 GCM 收到推送通知

如何使用 Java GCM API 在 android 设备上获取失败推送通知的注册 ID

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