【问题标题】:Use GCMIntentService or GCMBroadcastReceiver to post a statusbar notice?使用 GCMIntentService 或 GCMBroadcastReceiver 发布状态栏通知?
【发布时间】:2014-08-24 21:52:40
【问题描述】:

我正在尝试将 GCM 设置为在向我的应用发送消息时发布状态栏通知。当按下通知时,它应该启动应用程序以实际检索消息。我遇到的问题是试图决定如何拦截和处理传入的 GCM 消息。收到 GCM 消息时应用程序可能未运行,因此我认为我需要 GCMIntentService 来接收 GCM 消息并将通知发布到状态栏。这听起来对吗?按下状态栏通知时启动应用程序是通过设置通知的方式完成的吗?是这样,还是需要自定义广播接收器来接收状态栏通知点击?在进入实现细节之前,我需要对整体设计问题的回答。我已经通过 GCM 注册了 AndroidManifest.xml 设置和 MainActivity.java 设置,但我仍然需要知道如何设计传入消息处理。关键点是应用程序可能没有运行,但消息仍必须转到状态栏,然后单击通知启动应用程序。另外,当广播接收者被杀死时,应用程序不应该被杀死,所以广播接收者必须是分开的。

在这个冗长的问题之后,我希望你仍然和我在一起,并就如何设置它提供一些建议。如果有帮助,我可以发布到目前为止我所拥有的代码。谢谢。

更新: 似乎我可能想使用 GCMIntentService 在 onMessage() 函数中发布通知。评论?

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<!-- Keeps the processor from sleeping when a message is received. -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.USE_CREDENTIALS"/>

<!-- GCM requires a Google account. -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<permission android:protectionLevel="signature"
    android:name="com.pictureplay.permission.C2D_MESSAGE" />
<uses-permission android:name="com.pictureplay.permission.C2D_MESSAGE" />


<receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>

            <!-- Receives the actual messages. -->
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <!-- Receives the registration id. -->
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            <category android:name="com.pictureplay.gcm" />
        </intent-filter>
    </receiver>

【问题讨论】:

  • 您阅读过 GCM 文档吗?您需要的一切都在那里。
  • 我已经阅读了十几遍,但仍然缺少部分内容。文档是零散的,并不总是适合我的使用。

标签: android notifications google-cloud-messaging


【解决方案1】:

在收到 GCM 消息时应用程序可能未运行,因此我认为我需要 GCMIntentService 来接收 GCM 消息并将通知发布到状态栏。这听起来对吗?

不,部分原因是没有GCMIntentService,除非您使用该名称编写自己的类。

发布Notification 相当快,如果您的应用不需要执行磁盘I/O 来获取数据以显示在Notification 中。您可以通过BroadcastReceiver 及其onReceive() 方法安全地执行快速操作。您的 GCM 消息将传送到您的广播接收器(请参阅the GCM docs,第六个项目符号)。

另外,当广播接收者被杀死时,应用程序不应该被杀死,所以广播接收者必须是分开的。

BroadcastReceiver 在任何传统的 Android 使用术语“被杀死”中都不会被“杀死”。

【讨论】:

  • 如果当 GCM 需要发送消息时,BroadcastReceiver 没有运行(因为应用程序没有运行),GCM 是否仍然知道发送到 BR?这就是为什么我认为我需要一项服务。我已经在 Parse.com 上试过这个,如果 Parse 服务没有唤醒,推送永远不会收到。如果有帮助,我在上面添加了我的 AndroidManifest 条目。关于被杀的评论来自谷歌文档中的“如果该进程仅托管广播接收器,系统将认为其进程为空并积极杀死它,以便资源可用于其他更重要的进程”
  • @user2431174: "如果 BroadcastReceiver 没有运行" -- manifest-registered BroadcastReceivers 根据需要创建,用于一次广播,然后被丢弃。 “GCM 是否仍会知道发送 BR”——是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多