Parse.com - 自定义通知vs setDefaultPushCallback - 启动错误的活动

时间:2014-05-13 21:23:35

标签: android notifications parse-platform

目标

  • Parse后端的移动应用
  • 用户向所有/管理员/特定用户创建消息
  • “收件人”收到通知,告知他们有新邮件
  • 点击通知后,会显示有关该消息的详细信息

目前的方法

我在afterSave云代码方法中创建了一个自定义推送。电话看起来像这样:

Parse.Push.send({
    where : query,
    data : {
        action : "com.acme.CUSTOM_ACTION_GOES_HERE",
        content : messageContent
    }
}).then(...

(查询定义为获取特定的Parse.Installation个对象。)

在Android应用中,我有一个像这样注册的BroadcastReceiver

<receiver
    android:name=".MyBroadcastReceiver"
    android:exported="false" >
    <intent-filter>
        <action android:name="com.acme.CUSTOM_ACTION_GOES_HERE" >
        </action>
    </intent-filter>
</receiver>

在broadcastreceiver的onReceive方法中,我创建了自定义通知,其中我还定义了在单击通知时启动活动的待处理意图:

Intent contentIntent = new Intent(context, DisplayDetailsActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(DisplayDetailsActivity.class);
stackBuilder.addNextIntent(contentIntent);
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
Notification noti = new Notification.Builder(context)
.setContentTitle("New message")
.setContentText(content)
.setSmallIcon(R.drawable.ic_stat_notify_message)
.setNumber(notificationsCount)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.build();
noti.defaults |= Notification.DEFAULT_SOUND;
NotificationManager mgr = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
mgr.notify(555, noti);

问题

不调用(例如在应用程序的onCreate方法中)

PushService.setDefaultPushCallback(getApplicationContext(), SomeActivity.class);

...推送未送到设备

使用该通话时,点击通知时会启动活动SomeActivity,而不是广播接收器中意图中设置的活动DisplayDetailsActivity

当我只有一种类型的自定义通知时,可以使用setDefaultPushCallback作为第二个参数调用DisplayDetailsActivity.class

但是,我计划有多个不同的自定义通知,单击每个自定义通知应该启动不同的活动。在这种情况下,上面提到的解决方法不再是可行的选择。

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

经过几个小时的工作后,我偶然发现了这篇文章,我从@pareshgoel解决方法开始,基本的想法是删除注册一个Activity或订阅一个频道的需要(如果不需要)并降低服务器请求Installation类。

我从Parse.com上获取了Parse-1.5.1.jar并使用了JD-GUI,我查看了PushService.setDefaultPushCallback(Context context, Class<? extends Activity> cls)

它做的是

if cls is null remove subscription; create subscription for new cls; call PushService.startServiceIfRequired

如果设备不支持GCM或向GCM发送注册请求,等待registration_id,并在到达时更新安装设备令牌,则函数PushService.startServiceIfRequired启动解析推送服务。

我的解决方法是使用:PushService.startServiceIfRequired - 似乎没有记录,您可以在初始化后使用,或者如果您在登录/注册后拥有用户,因为它使用的是后台任务,它可以在主线程上调用。

另一个优点是使用PushService.startServiceIfRequired您有2个服务器请求来保存/更新Installation类,第一个将推送类型设置为GCM,第二个将pushtype设置为GCM,将设备令牌设置为registration_id 。 PushService.setDefaultPushCallback引入了初始服务器请求。

答案 1 :(得分:0)

我遇到了同样的问题,并且有一个解决方法。

首先需要调用setDefaultPushCallback以使Parse推送通知正常工作。这很可能是一个Parse的错误。我正在使用Parse Android 1.5.1。

解决方法是不设置&#34;警报&#34; param中的param推送通知发送代码。 如果未设置,则Parse将不会自行显示警报,并且您的自定义广播接收器可以处理推送。

Parse中的推送通知需要更多的bug修复才能可靠地使用。