6

我在我的应用程序中使用解析通知。我正在使用 GcmBroadcastReceiver 接收通知警报。但是我看到我的应用收到了很多通知。我想更新状态栏中的通知,所以我使用了自定义接收器。通过 GcmBroadcastReceiver 接收通知时,我的自定义广播接收器调用。所以在我的状态栏中有 gcm 和自定义通知。我只想要自定义通知。如何解决这个问题呢?

清单代码:

    <receiver android:name="com.parse.ParseBroadcastReceiver" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <action android:name="android.intent.action.USER_PRESENT" />
        </intent-filter>
    </receiver>
    <receiver
        android:name="com.parse.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <!-- IMPORTANT: Change "com.parse.tutorials.pushnotifications" to match your app's package name. -->
            <category android:name="com.packagename" />
        </intent-filter>
    </receiver>
    <receiver
        android:name="com.parse.ParsePushBroadcastReceiver"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.parse.push.intent.RECEIVE" />
            <action android:name="com.parse.push.intent.DELETE" />
            <action android:name="com.parse.push.intent.OPEN" />
        </intent-filter>
    </receiver>
    <receiver
        android:name="com.packagename.IncomingReceiver"
        android:enabled="true"
        android:exported="false" >
        <intent-filter>

            <action android:name="com.packagename.UPDATE_STATUS" />
        </intent-filter>
    </receiver>

应用类

Parse.initialize(this, "app id", "client id");

传入接收者类:

 public class IncomingReceiver extends BroadcastReceiver {
    private static final int NOTIFICATION_ID = 1;
    public static int numMessages = 0;


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


        try {
            String action = intent.getAction();
            JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));
            if (action.equalsIgnoreCase("com.packagename.UPDATE_STATUS")) {
                String title = "appname";

                if (json.has("header"))
                    title = json.getString("header");

                generateNotification(context, title, json,contenttext);
            }
        } catch (JSONException e) {
            Log.d("jsonexc", "JSONException: " + e.getMessage());
        }
    }

    private void generateNotification(Context context, String title, JSONObject json, String contenttext) {
        Intent intent = new Intent(context, NewActivity.class);
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);

        NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context).setSmallIcon(R.drawable.app_icon).setContentTitle(title).setContentText("contenttext").setNumber(++numMessages);

        mBuilder.setContentIntent(contentIntent);
        mNotifM.notify(NOTIFICATION_ID, mBuilder.build());

    }
} 
4

4 回答 4

12

代替它

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

给你的:

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

并创建类:

public class MyReceiver extends ParsePushBroadcastReceiver {

    protected void onPushReceive(Context mContext, Intent intent) {
    //enter your custom here generateNotification();
    }

}
于 2014-11-12T20:08:55.773 回答
5

只需删除super.onPushReceive(context, intent); 从您的自定义接收器接收单个自定义通知。

于 2015-05-04T16:43:42.127 回答
1

我只是添加了与 ParsePushReceiver 具有相同包名的自定义 PushReceiver

package com.parse;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;

import com.squareup.otto.EventBus;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.Locale;
import java.util.Random;

public class ParsePushReceiver extends ParsePushBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();
        byte var5 = -1;
        switch (intentAction.hashCode()) {
            case -824874927:
                if (intentAction.equals("com.parse.push.intent.DELETE")) {
                    var5 = 1;
                }
                break;
            case -269490979:
                if (intentAction.equals("com.parse.push.intent.RECEIVE")) {
                    var5 = 0;
                }
                break;
            case 374898288:
                if (intentAction.equals("com.parse.push.intent.OPEN")) {
                    var5 = 2;
                }
        }

        switch (var5) {
            case 0:
                onPushReceive(context, intent);
                break;
            case 1:
                super.onPushDismiss(context, intent);
                break;
            case 2:
                super.onPushOpen(context, intent);
        }
    }

    @Override
    protected void onPushReceive(Context context, Intent intent) {

        try {
            JSONObject pushData = new JSONObject(intent.getStringExtra("com.parse.Data"));

            String action;
            action = pushData.optString("action", null);

            if (action != null) {
                Bundle notification = intent.getExtras();
                Intent broadcastIntent = new Intent();
                broadcastIntent.putExtras(notification);
                broadcastIntent.setAction(action);
                broadcastIntent.setPackage(context.getPackageName());
                context.sendBroadcast(broadcastIntent);
            }

            if (pushData.has(Push.PUSH_TYPE)) {
                String type = pushData.getString(Push.PUSH_TYPE);
                switch (PushType.fromString(type)) {
                    case chat:
                    case booked:
                    case rate:
                    case unknown:
                        break;
                }
            } else {
                sendGlobalNoti(context, intent, null);
            }
        } catch (JSONException var7) {
            PLog.e("ParsePushReceiver", "Unexpected JSONException when receiving push data: ", var7);
        }
    }

    private void sendChattingNoti(Context context, Intent intent, PushType pushType) {

        JSONObject pushData = this.getPushData(intent);
        if (((User) ParseUser.getCurrentUser()).getChattingNotiEnabled()
                && pushData != null
                && pushData.has("title")) {
            NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            android.support.v4.app.NotificationCompat.Builder builder = new android.support.v4.app.NotificationCompat.Builder(context);

            String title = pushData.optString("title", context.getString(R.string.app_name));
            String message = pushData.optString("alert", "Notification received.");

            switch (pushType) {
                case booked:
                    message = context.getString(R.string.lesson_booked_message);
                    break;
                case lessonConfirmed:
                    message = context.getString(R.string.lesson_confirmed);
                    break;
                case lessonCanceled:
                    message = context.getString(R.string.lesson_canceled);
                    break;
            }

            builder.setContentTitle(title);
            builder.setContentText(message);
            builder.setTicker(title + ": " + message);
            builder.setAutoCancel(true);
            builder.setOnlyAlertOnce(false);

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
                builder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_notification));
            builder.setSmallIcon(R.drawable.ic_notification);

            Intent chatIntent = new Intent(Keys.IntentKeys.ACTION_SHOW_CHAT);
            chatIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
            chatIntent.addCategory(Intent.CATEGORY_DEFAULT);
            String chatId = pushData.optString(Push.PUSH_CHAT_ID, null);
            if (chatId != null)
                chatIntent.putExtra(Keys.EXTRA_CHAT_ID, chatId);

            PendingIntent pending = PendingIntent.getActivity(context, 0, chatIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            builder.setContentIntent(pending);

            Notification noti = builder.build();
            noti.defaults |= Notification.DEFAULT_VIBRATE;
            noti.defaults |= Notification.DEFAULT_SOUND;
            noti.defaults |= Notification.DEFAULT_LIGHTS;
            nm.notify(pushType.ordinal(), noti);
        }
    }

    private void sendGlobalNoti(Context context, Intent intent, String defaultAlert) {
        // Global Notification
        if (((User) ParseUser.getCurrentUser()).getGlobalNotiEnabled()) {
            Notification notification = getNotification(context, intent, defaultAlert);
            if (notification != null)
                ParseNotificationManager.getInstance().showNotification(context, notification);
        }
    }

    protected Notification getNotification(Context context, Intent intent, String defaultAlert) {
        JSONObject pushData = this.getPushData(intent);
        if (pushData != null && (pushData.has("alert") || pushData.has("title"))) {
            String title = pushData.optString("title", ManifestInfo.getDisplayName(context));
            String alert = pushData.optString("alert", defaultAlert == null ? "Notification received." : defaultAlert);
            String tickerText = String.format(Locale.getDefault(), "%s: %s", new Object[]{title, alert});
            Bundle extras = intent.getExtras();
            Random random = new Random();
            int contentIntentRequestCode = random.nextInt();
            int deleteIntentRequestCode = random.nextInt();
            String packageName = context.getPackageName();
            Intent contentIntent = new Intent("com.parse.push.intent.OPEN");
            contentIntent.putExtras(extras);
            contentIntent.setPackage(packageName);
            Intent deleteIntent = new Intent("com.parse.push.intent.DELETE");
            deleteIntent.putExtras(extras);
            deleteIntent.setPackage(packageName);
            PendingIntent pContentIntent = PendingIntent.getBroadcast(context, contentIntentRequestCode, contentIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            PendingIntent pDeleteIntent = PendingIntent.getBroadcast(context, deleteIntentRequestCode, deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT);
            NotificationCompat.Builder parseBuilder = new NotificationCompat.Builder(context);
            parseBuilder.setContentTitle(title).setContentText(alert).setTicker(tickerText).setSmallIcon(this.getSmallIconId(context, intent)).setLargeIcon(this.getLargeIcon(context, intent)).setContentIntent(pContentIntent).setDeleteIntent(pDeleteIntent).setAutoCancel(true).setDefaults(-1);
            if (alert != null && alert.length() > 38) {
                parseBuilder.setStyle((new NotificationCompat.Builder.BigTextStyle()).bigText(alert));
            }

            return parseBuilder.build();
        } else {
            return null;
        }
    }

    private JSONObject getPushData(Intent intent) {
        try {
            return new JSONObject(intent.getStringExtra("com.parse.Data"));
        } catch (JSONException var3) {
            PLog.e("ParsePushReceiver", "Unexpected JSONException when receiving push data: ", var3);
            return null;
        }
    }
}
于 2015-07-23T07:14:14.203 回答
0

在您正在使用的清单文件中

com.parse.GcmBroadcastReceiver

而不是使用您的自定义广播接收器,在您的情况下简单更改 > com.parse.GcmBroadcastReceivercom.yourpackagename. IncomingReceiver

不要在模拟器中测试 BroadcastReceiver 它不会工作,所以在真正的 Android 中测试它

请参阅此 repo,它使用自定义广播接收器来解析推送通知 https://github.com/srini-hashinc/IIYO

于 2015-06-14T20:16:06.637 回答