在Android上使用GCM进行推送通知

6
我正在尝试在我的安卓应用程序上实现推送通知。因此,最好的起点就是Google开发者页面。
我正在尝试按照这里的教程:GCM演示应用。教程建议使用通过SDK Manager提供的示例代码。在这样做并尝试发送推送通知时,当应用程序正在运行时,我会看到屏幕上显示新的推送已经到达的消息。
然而,当应用程序处于后台或未运行时,我没有收到弹出式和带有声音的推送通知。如果我打开应用程序,屏幕上再次显示消息。但我从未收到任何形式的通知。
我需要在安卓中手动操作吗?我认为它应该类似于iOS,平台负责向您显示通知。
有什么想法如何实现它?

我非常新手,但是如果应用程序不在前台,接收通知可能需要一些时间,这是否可能? - android developer
你收到了设备成功添加的消息,但是Demo应用程序在后台时没有收到通知?是吗? - Yahor10
如果设备在线,可能需要几分钟,但我从未见过它需要一小时。 - Yahor10
http://en.wikipedia.org/wiki/Android_rooting - Yahor10
该设备绝不是“已取得root权限”。 - donparalias
显示剩余5条评论
2个回答

5
但我从未收到过弹出窗口和声音的通知。当通知被触发时,可以将声音编程到代码中,例如:

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)方法中。

你能帮我修复它吗?我需要通知弹出并播放声音。这两行代码就是我应该实现的全部内容吗? - donparalias
1
这比那稍微复杂一些。要发送通知,请查看这个问题中的代码 - https://dev59.com/P2w05IYBdhLWcg3wxkmr 至于通知弹出,您可以将GCM消息传递给注册到您的活动中的BroadcastReceiver,然后显示警报对话框。 警报对话框的示例代码 - http://www.mkyong.com/android/android-alert-dialog-example/ - Deepak Bala
1
@DeepakBala,您的回答提到了Android上的静默通知。我正在处理Android的静默推送通知问题,其中如果用户已经登录到应用程序,则应用程序需要知道它已订阅该频道。但是用户无需受到任何通知的干扰。您有什么想法,我该怎么做呢? - silent_programmer
@AtharvaPuranik 是的。跟踪活动对用户是否可见,并在接收GCM消息的类上使用此标志来决定是否应生成通知。我们公司为2种应用内消息收件箱制作的Android SDK上有一个可工作的示例 - https://github.com/deepak-bala/konotor-android。该存储库没有代码,但如果您创建一个问题,我可以分享一些片段。 - Deepak Bala
@DeepakBala 这是我最近发布的问题链接:http://stackoverflow.com/questions/29305176/android-silent-push-notification谢谢! - silent_programmer

3
尝试注销并重新注册您的设备。 在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);
    }

作为替代方案,您可以在清单、活动或前台服务中注册BroadcastReceiver。

为什么?你有什么想法,认为这能帮助什么?即使它有用,也不会很可怕吗?毕竟这将成为一个生产应用程序,推送功能不能工作! - donparalias
当您在服务器上编辑不正确的注册信息时,这并不可怕。这种情况不会发生在生产应用程序中。 - Yahor10
使用第三方服务器监控您的用户。当有1万个用户长时间处于空闲状态时,您应该通过GCM服务错误通知他们。 - Yahor10
我觉得你理解错了,兄弟。我收到了消息...当我打开应用程序时,所有的消息都在那里...问题是我没有收到通知。没有弹出窗口和声音来通知用户。如我所描述的那样,消息确实存在,它在一秒钟内到达,但没有通知气泡。 - donparalias
@Yahor10,您能否对这个问题提出一些建议:http://stackoverflow.com/questions/18571844/gcm-not-sending-the-notifications - Developer
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接