在没有通知的情况下解析推送通知

Parse Push Notifications without the notification

正在阅读 Parse.com 上的 Docs 我找不到在不显示默认通知 的情况下接收推送消息的方法 。我想获取消息 (a JSON),对其进行一些处理,然后(如有必要)使用它准备自定义通知。 可能吗?我不明白为什么不应该这样做,但文档对此并不清楚。

您在这两个方面都是正确的 - 文档可以使用更多的细节,这是可能的。

首先,为了提供您自己的逻辑实现,您需要创建自己的广播接收器 class 扩展 ParsePushBroadcastReceiver。执行此操作时,您必须更新清单文件并将 <receiver> 指向您的 class 而不是 ParsePushBroadcastReceiver.

在您新创建的 class 中,getNotification() 方法负责创建通知。当您不想显示通知时,将其覆盖为 return null,或者创建您自己的 Notification 和 return 或调用 super 实现如果您愿意,可以使用默认值 Notification

您有许多其他 "hooks"(可重写的方法)在接收推送时执行您的逻辑,每个接收一个 Context 和一个 Intent 作为参数。在这些方法中的每一种中,您都可以获得 JSON 数据,只需调用:

JSONObject notificationData = new JSONObject(intent.getStringExtra(KEY_PUSH_DATA));

您可以通过创建自己的 BroadcastReceiver 来过滤解析的操作来实现。为此,您需要将 ParsePushBroadcastReceiver 替换为您自己的接收器(在这种情况下为 NotiReceiver)。例如..

在AndroidManifest.xml

<receiver
    android:name=".NotiReceiver"
    android:exported="false" >
    <intent-filter>
        <action android:name="com.parse.push.intent.RECEIVE" />
    </intent-filter>

在您的 NotiReceiver 中,

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (action.equals("com.parse.push.intent.RECEIVE")) { 
        Log.i("Data : ", intent.getExtras().getString("com.parse.Data"));
    }
}

希望对你有用。

如果您遵循通知的生命周期,您会发现仍然可以实现您想要的效果,而无需自己执行很多操作。控制推送通知(特别是显示或不显示)的最简单和最基本的方法是覆盖 ParsePushBroadcastReceiveronReceive 方法。如果您调用 super.onReceive(),则通知将继续通知的生命周期并显示 - 如果您不调用 super.onReceive(),则生命周期结束并且不会显示通知(因此不会调用 getNotification())。当前接受的答案让您不必要地将生命周期继续到 getNotification() 并返回 null 但是如果 super.onReceive() 没有被调用那么 getNotification() 也不会被调用。下面是一个更简洁的方法,可以用更少的代码获得你想要的东西。

public class MyParsePushBroadcastReceiver extends ParsePushBroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {

        if (shouldShowNotification){
           super.onReceive(context, intent);
        }
        //proccess the notification without being displayed
   }

   @Override
    protected Notification getNotification(Context context, Intent intent) {
        //this is only called if super.onReceive() is called
        Notification n = super.getNotification(context, intent);
        n.sound = Uri.parse("android.resource://" + context.getPackageName() + "/some_sound.mp3");
        return n;
    }
}

即使您不希望显示通知,在当前接受的答案中也建议您必须构建自己的通知,这也是不必要的,因为可以自由自定义 Parse SDK 为您提供的通知以及在 getNotification() 方法中返回它之前。但是因为您不想显示任何东西,所以您不必担心这一点。这包含在上面的示例代码中。