[Parse][Android] 如何在应用程序运行时禁止显示推送通知?
Posted
技术标签:
【中文标题】[Parse][Android] 如何在应用程序运行时禁止显示推送通知?【英文标题】:[Parse][Android] How to suppress push notification from being displayed when app is running? 【发布时间】:2013-06-17 21:36:41 【问题描述】:我需要通过两种方式处理推送通知:
1) 当应用处于后台时,接收并在我的 android 客户端的状态栏上放置通知;
2) 当我的应用处于前台时,接收并处理通知而不在状态栏上显示;
对于(1)很简单,我把 并打电话 PushService.setDefaultPushCallback(context, classObject); 并且通知正确显示在状态栏上。
我的问题在于 (2):
我试图创建一个自定义的广播接收器,但解析会在我面前接收通知并将其显示在状态栏上; 我试图关闭 PushService.setDefaultPushCallback(上下文,类对象) 在 onStart 方法上通过为 classObject 设置 null 值,但是当我这样做时,我的接收器从未被调用并且通知没有出现;在解析之前我可以做些什么来拦截通知,或者我可以做些什么来解决我的问题?
ps:我需要用“alert”从服务器发送消息
Tks,
【问题讨论】:
您是否为 BroadcastReceiver 设置了优先级? 是的,我试过了,但它不是一个有序的广播,而且似乎我把它放在不改变效果的优先级并不重要。 通知到来时哪个动作正在调用广播接收器。你能推荐我吗? 【参考方案1】:如果您在 json 数据中使用“alert”或“title”,com.parse.PushService 将拦截并显示标准通知。
而是创建您自己的广播接收器并将标题发送为例如json中的“标题”。然后,您可以在 onReceive 处理程序中控制显示的时间和内容。
例如
public class MyBroadcastReceiver extends BroadcastReceiver
private static final String TAG = "MyBroadcastReceiver";
@Override
public void onReceive(Context context, Intent intent)
try
String action = intent.getAction();
String channel = intent.getExtras().getString("com.parse.Channel");
JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));
String title = "New alert!";
if (json.has("header"))
title = json.getString("header");
generateNotification(context, getImg(), title);
catch (Exception e)
Log.d(TAG, "JSONException: " + e.getMessage());
public static void generateNotification(Context context, int icon, String message)
// Show the notification
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);
String title = context.getString(R.string.app_name);
Intent notificationIntent = new Intent(context, SnapClientActivity.class);
// set intent so it does not start a new activity
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, intent);
notification.vibrate = new long[] 500, 500 ;
notification.sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
notification.flags =
Notification.FLAG_AUTO_CANCEL |
Notification.FLAG_SHOW_LIGHTS;
notificationManager.notify(0, notification);
【讨论】:
嗨,你能告诉我在哪里调用这个 MyBroadcastReceiver @SAndroidD 研究广播接收器更多。它们不会以您的思维方式“被称为”。只有在您发送消息时才会调用它们。和汉内斯:+1 做得很好。非常感谢。 onReceive 在我的应用程序中从未被调用...对于我的自定义广播接收器 @Hannes 我正在尝试从 android 发送 json 但无法在目标移动设备中接收? @LoyalRayne 我正在尝试从 android 发送 json 但未能在目标移动设备中接收?无法通过传递对象 ID groups.google.com/forum/#!topic/parse-developers/9NOpSxxB2Ro 发送给特定用户【参考方案2】:我遇到了同样的问题。在尝试其他解决方案不成功后,我尝试了更简单的解决方案......它奏效了。
使用自定义 ParsePushBroadcastReceiver 时,请覆盖 onPushReceiver 方法。并且仅在您的应用未处于活动状态时调用超类方法。
public class ParsePushReceiver extends com.parse.ParsePushBroadcastReceiver
@Override
protected void onPushReceive(Context context, Intent intent )
// do your stuff here
if( !MyApp.active )
super.onPushReceive(context, intent );
【讨论】:
这确实是一个优雅的解决方案,以防万一其他人想知道您必须替换不要忘记在您的 AndroidManifest.xml
中注册您的自定义 BroadcastReceiver,正如 Parse.com 的文档所述:
如果您的代码位于 com.example 包中,并且您想为 com.example.UPDATE_STATUS 操作注册接收器,则可以在 ParseBroadcastReceiver 块结束后立即将以下 XML 添加到您的 AndroidManifest.xml 文件中你之前创建的:
<receiver android:name="com.example.MyCustomReceiver" android:exported="false">
<intent-filter>
<action android:name="com.example.UPDATE_STATUS" />
</intent-filter>
</receiver>
只要收到带有 com.example.UPDATE_STATUS 操作参数的推送通知,就会调用您的自定义接收器。出于安全目的,Parse SDK 确保此意图只能由您的应用程序中的接收者处理。您还应确保在您的元素上设置 android:exported 属性,以防止其他应用向您的接收器发送推送。
【讨论】:
【参考方案4】:Hannes 是正确的,但无论应用程序是否正在运行,该解决方案仍会生成通知。
要回答您的全部问题,请在此处结合使用 Hannes 的代码:How can I tell if Android app is running in the foreground?
只有在应用未运行时,您才会调用 generateNotification()。
【讨论】:
以上是关于[Parse][Android] 如何在应用程序运行时禁止显示推送通知?的主要内容,如果未能解决你的问题,请参考以下文章
如何在cordova android上连接PushPlugin + Parse
如何:使用 Parse 在 Xamarin.Android 应用程序上进行 Facebook 单点登录 (SSO)?
如何使用 Parse.com 推送通知服务在 Android 应用程序中推送 URL?
Android:如何使用 Parse.com 的 Bolts 同步查询?
如何在我的 android 应用程序中修复 INSTALL_PARSE_FAILED_MANIFEST_MALFORMED