【问题标题】:Extra push notification sent to Android device发送到 Android 设备的额外推送通知
【发布时间】:2023-03-06 03:30:01
【问题描述】:

我已经实现了 Parse 推送通知,但我在 Android 方面存在问题。每当我从 Parse 发送通知时,所有 Android 设备都会收到两个通知,一个是我发送的文本,另一个是空文本。

请提出这里可能出现的问题

注意:我还在我的项目中添加了原生 Android 通知(GCM 通知)。有没有可能是他们造成了这个问题?

谢谢。

AndroidManifest 设置如下:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />


<application
    android:name=".activityApplication"
    android:label="@string/app_name"
    android:icon="@drawable/icon">

    <activity android:name=".activity"
              android:label="@string/app_name"
              android:screenOrientation="landscape"
              android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
              android:configChanges="orientation">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="com.google.android.gms.ads.AdActivity"
    android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>


    <!-- gcm -->
    <receiver
        android:name="com.company.activity.GCBroadcastReceiver"
        android:exported="true"
        android:process=":remote"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />

            <category android:name="com.company.activity" />
        </intent-filter>
    </receiver>

    <service android:name=".GcmIntentService" />
    <service android:name="com.parse.PushService" />
    <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" />
            <category android:name="com.company.activity" />
        </intent-filter>
    </receiver>


</application>

这是我的广播接收器:

public class GCBroadcastReceiver extends BroadcastReceiver
{
    private static final String TAG = "GCBroadcastReceiver";
    Context ctx;

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

        // Local notification.
            Bundle bundle = intent.getExtras();
        String message = bundle.getString("message");
                String notificationID = bundle.getString("notificationID");

        Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID);

        sendNotification(message, notificationID); 
     }

    // Put the GCM message into a notification and post it.
    private void sendNotification(final String message, final String notificationID)
    {

        Intent notificationIntent = new Intent(ctx, Activity.class);
        PendingIntent intent = PendingIntent.getActivity(ctx, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);


        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(ctx);

        mBuilder.setContentIntent(intent);
        mBuilder.setStyle(new NotificationCompat.BigTextStyle().bigText(message));
        mBuilder.setWhen(System.currentTimeMillis());
        mBuilder.setSmallIcon(R.drawable.icon);
        mBuilder.setContentTitle(ctx.getString(R.string.app_name));
        mBuilder.setContentText(message);
        mBuilder.setLights(Color.RED, 400, 400);
        mBuilder.setAutoCancel(true);
        //mBuilder.setSound(Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + ctx.getPackageName() + "/raw/" + sound));
        mBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE);

        NotificationManager mNotificationManager = (NotificationManager) ctx
            .getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify(0, mBuilder.build());
    }
}

【问题讨论】:

    标签: android notifications push-notification parse-platform google-cloud-messaging


    【解决方案1】:

    Parse 使用 GCM,因此如果您向使用 Parse 的应用程序发送通知,并且您使用显示通知的原生 Android 代码处理 GCM 消息,则通知可能会被处理两次(一次由您的代码Parse 一次),这将导致它显示两次。

    至于为什么其中一个通知有空文本 - 显示它的代码可能希望文本位于服务器未发送的额外参数中,因此没有文本可显示。

    更新:

    现在我看到了你的代码,我可以添加以下内容:

    您有两个广播接收器来处理传入的 GCM 消息 - com.parse.GcmBroadcastReceivercom.company.activity.GCBroadcastReceiver。他们俩都尝试处理从 Parse 发送到您设备的通知(根据您在下面的评论,我了解到当您发送“本地”通知时不会出现问题)。

    我假设 Parse 库自行注册到 GCM。如果您使用不同的发件人 ID(API 项目 ID)进行解析注册和本地 GCM 注册,您可以通过在 onReceive 方法中检查 intent.getExtras ().get("from") 来解决您的问题。如果不包含您本地通知的发件人ID,请不要拨打sendNotification(message, notificationID);,第二个带有空文本的通知将不会显示。

    public void onReceive(Context context, Intent intent)
    {
        ctx = context;
    
        // Local notification.
            Bundle bundle = intent.getExtras();
        String message = bundle.getString("message");
                String notificationID = bundle.getString("notificationID");
    
        Log.v(TAG,"Notification message : " + message + "With ID : " + notificationID);
    
        if (intent.getExtras ().get("from").equals (YOUR_SENDER_ID_FOR_LOCAL_NOTIFICATIONS))
            sendNotification(message, notificationID); 
     }
    

    现在,如果您对两种类型的通知使用相同的发件人 ID,您可以开始使用不同的发件人 ID,也可以使用不同的条件 - 检查 intent.getExtras ().get("message") 是否有值。您的本地通知需要此参数,我假设 Parse 通知不需要(这解释了您看到的没有文本的通知)。

    使用两个 GCM 广播接收器也可能会导致其他问题,因此我建议您查看this question 以进一步阅读。

    【讨论】:

    • 感谢 Eran,这就是问题所在。当 Parse 通知被触发时,我的 BroadcastReceiver 的 onReceive 方法也会被调用,我得到这个日志“GCBroadcastReceiver(21137): Notification message : null, With ID: null”,这会导致一个额外的空通知。基本上,我添加了 GCM 来实现本地通知以及 Parse 推送通知。本地通知对我来说非常有效,但我遇到了推送通知的上述问题。您能为此提出解决方案吗?
    • @EvG9 如果我看到您的代码(清单和广播接收器),我可能会提出一些建议。
    • 我已经用清单和广播接收器更新了我的原始帖子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2020-12-24
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    相关资源
    最近更新 更多