Getting notification endlessly from GCM Intent Service in android

半腔热情 提交于 2019-12-10 10:34:34

问题


I have created a activity which got refreshes while a notification occurs but I am facing one problem which is that when a notification came it continues to send endless same notification. Earlier it was working fine but I made some changes and this had done. Please help me. I am attaching my code with it.

Code for GCM IntentService class

         @Override
protected void onHandleIntent(Intent intent) {
    Bundle extras = intent.getExtras();
    String msgg = intent.getStringExtra("message");

     final ResultReceiver receiver = intent.getParcelableExtra("receiver");
    Bundle bundle = new Bundle();
    if (!extras.isEmpty()) {

        if (GoogleCloudMessaging.
                MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {

            sendNotification(this, msgg);


        } else if (GoogleCloudMessaging.
                MESSAGE_TYPE_DELETED.equals(messageType)) {

            sendNotification(this, msg);
            updateMyActivity(this,msgg);
            bundle.putString("result", msg);
            receiver.send(STATUS_FINISHED, bundle);

        } else if (GoogleCloudMessaging.
                MESSAGE_TYPE_MESSAGE.equals(messageType)) {
            updateMyActivity(this,msgg);
            sendNotification(this, msg);



        }


}

Send notification Code

 private void sendNotification(Context context, String message) {

    Intent resultIntent;

    int icon = R.mipmap.ic_launcher;
    long when = System.currentTimeMillis();
    NotificationCompat.Builder nBuilder;
    Uri alarmSound = RingtoneManager
            .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);


    NotificationCompat.BigPictureStyle notiStyle = new
            NotificationCompat.BigPictureStyle();
    notiStyle.setBigContentTitle("afewtaps");
    notiStyle.setSummaryText(message);


    nBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(icon)
            .setContentTitle("afewtaps")
            .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
            .setLights(Color.BLUE, 500, 500).setContentText(message)
            .setAutoCancel(true).setTicker("Notification from afewtaps")
            .setSound(alarmSound);



    resultIntent = new Intent(context,
            LoginActivity.class);
    resultIntent.putExtra("message", message);

    resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


    PendingIntent resultPendingIntent = PendingIntent.getActivity(context,
            notify_no, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    // Show the max number of notifications here
    if (notify_no < 9) {
        notify_no = notify_no + 1;
    } else {
        notify_no = 0;
    }
    nBuilder.setContentIntent(resultPendingIntent);

    NotificationManager nNotifyMgr = (NotificationManager) context
            .getSystemService(context.NOTIFICATION_SERVICE);



    nNotifyMgr.notify(notify_no + 2, nBuilder.build());


}

Send message to broadcast

    // This function will create an intent. This intent must take as parameter the "unique_name" that you registered your activity with
static void updateMyActivity(Context context, String message) {

    Intent intent = new Intent("com.google.android.c2dm.intent.RECEIVE");

    //put whatever data you want to send, if any
    intent.putExtra("message", message);

    //send broadcast
    context.sendBroadcast(intent);
}

this ends code for intent class.

now code of my activity

         @Override
public void onResume() {
    super.onResume();
   // connectToDatabase();
    getActivity().registerReceiver(mMessageReceiver, new IntentFilter("com.google.android.c2dm.intent.RECEIVE"));
}

//Must unregister onPause()
@Override
public void onPause() {
    super.onPause();
    getActivity().unregisterReceiver(mMessageReceiver);
}


//This is the handler that will manager to process the broadcast intent
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {

        // Extract data included in the Intent
        String message = intent.getStringExtra("message");

        //do other stuff here

        connectToDatabase();


    }
};

回答1:


Okay. So what is happening with your code is that you are sending a broadcast to your Receiver as well forcing the onHandleIntent to be invoked again, which in result calls the updateActivity method, which again broadcasts and loop continues endlessly.

In your updateMyActivity method, please change this:

Intent intent = new Intent("com.google.android.c2dm.intent.RECEIVE");

to

Intent intent = new Intent("myMessage");

The culprit here is

com.google.android.c2dm.intent.RECEIVE

which calls the onHandleIntent when broadcasted.

Also, in your onResume method of the activity, please change the TAG to myMessage:

getActivity().registerReceiver(mMessageReceiver, new IntentFilter("myMessage"))


来源:https://stackoverflow.com/questions/41355335/getting-notification-endlessly-from-gcm-intent-service-in-android

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!