在没有通知的情况下解析推送通知
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"));
}
}
希望对你有用。
如果您遵循通知的生命周期,您会发现仍然可以实现您想要的效果,而无需自己执行很多操作。控制推送通知(特别是显示或不显示)的最简单和最基本的方法是覆盖 ParsePushBroadcastReceiver
的 onReceive
方法。如果您调用 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()
方法中返回它之前。但是因为您不想显示任何东西,所以您不必担心这一点。这包含在上面的示例代码中。
正在阅读 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"));
}
}
希望对你有用。
如果您遵循通知的生命周期,您会发现仍然可以实现您想要的效果,而无需自己执行很多操作。控制推送通知(特别是显示或不显示)的最简单和最基本的方法是覆盖 ParsePushBroadcastReceiver
的 onReceive
方法。如果您调用 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()
方法中返回它之前。但是因为您不想显示任何东西,所以您不必担心这一点。这包含在上面的示例代码中。