9

我需要以两种方式处理推送通知:

1)当应用程序在后台时,接收并在我的android客户端的状态栏上放置通知;

2)当我的应用程序处于前台时,接收并处理通知而不在状态栏上显示;

对于(1)很简单,我把并调用 PushService.setDefaultPushCallback(context, classObject); 并且通知正确显示在状态栏上。

我的问题是(2):

  • 我试图创建一个自定义的广播接收器,但解析会在我面前收到通知并将其显示在状态栏上;
  • 我试图通过为 classObject 设置 null 值来关闭 onStart 方法上的 PushService.setDefaultPushCallback(context, classObject),但是当我这样做时,我的接收器从未被调用并且通知没有出现;

在解析之前我可以做些什么来拦截通知,或者我可以做些什么来解决我的问题?

ps:我需要用“alert”从服务器发送消息

谢邀,

4

4 回答 4

28

如果您在 json 数据中使用“alert”或“title”,com.parse.PushService 将拦截并显示标准通知。

而是创建您自己的 BroadCastReceiver 并将标题发送为例如 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);
    }
}
于 2013-07-04T20:58:25.863 回答
7

我有同样的问题。在尝试其他解决方案失败后,我尝试了更简单的解决方案......并且它奏效了。

使用自定义 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 );
    }
}
于 2015-05-17T07:36:23.273 回答
1

不要忘记在您的 中注册您的自定义 BroadcastReceiver AndroidManifest.xml,正如 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 属性,以防止其他应用程序向您的接收器发送推送。

于 2014-06-03T12:17:17.607 回答
0

Hannes 是正确的,但无论应用程序是否正在运行,该解决方案仍会生成通知。

要回答您的全部问题,请在此处结合使用 Hannes 的代码:如何判断 Android 应用程序是否在前台运行?

只有当应用程序未运行时,您才会调用 generateNotification()。

于 2014-09-08T11:38:30.547 回答