1

Я только что внедрил приложение GCM, которое показывает уведомление при поступлении сообщения GCM. как запустить приложение при поступлении сообщения? такой же, как и вибер. вы получаете всплывающее окно, когда приходит сообщение.Как запустить приложение вместо создания уведомления при получении сообщения GCM?

EDIT:

Большое спасибо за помогает, но я предполагаю, что большинство из вас, ребята объяснили требуют, чтобы пользователь, чтобы нажать на уведомления для того, чтобы запустить приложение. Мне нужно, чтобы активность автоматически запускалась, как только сообщение GCM поступает независимо от того, какое приложение находится на переднем плане или даже когда приложение находится в фоновом режиме или killstate.

вот мой GCMIntentService код:

package com.google.android.gcm.demo.app; 

import com.google.android.gms.gcm.GoogleCloudMessaging; 

import android.app.IntentService; 
import android.app.NotificationManager; 
import android.app.PendingIntent; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.os.SystemClock; 
import android.support.v4.app.NotificationCompat; 
import android.util.Log; 
import android.widget.Toast; 


public class GCMIntentService extends IntentService { 
    public static final int NOTIFICATION_ID = 1; 
    private NotificationManager mNotificationManager; 
    NotificationCompat.Builder builder; 

    public GCMIntentService() { 
     super("GcmIntentService"); 
    } 
    public static final String TAG = "GCM Demo"; 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Bundle extras = intent.getExtras(); 
     GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
     // The getMessageType() intent parameter must be the intent you received 
     // in your BroadcastReceiver. 
     String messageType = gcm.getMessageType(intent); 

     if (!extras.isEmpty()) { // has effect of unparcelling Bundle 
      /* 
      * Filter messages based on message type. Since it is likely that GCM will be 
      * extended in the future with new message types, just ignore any message types you're 
      * not interested in, or that you don't recognize. 
      */ 
      if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
       sendNotification("Send error: " + extras.toString()); 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED.equals(messageType)) { 
       sendNotification("Deleted messages on server: " + extras.toString()); 
       // If it's a regular GCM message, do some work. 
      } else if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType)) { 
       // This loop represents the service doing some work. 
       for (int i = 0; i < 5; i++) { 
        Log.i(TAG, "Working... " + (i + 1) 
          + "/5 @ " + SystemClock.elapsedRealtime()); 
        try { 
         Thread.sleep(5000); 
        } catch (InterruptedException e) { 
        } 
       } 
       Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime()); 
       startActivity(new Intent(getBaseContext(), DemoActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); 
       Intent myIntent = new Intent(getBaseContext(), DemoActivity.class); 
       startActivity(myIntent); 
       // Post notification of received message. 
       //sendNotification("Received: " + extras.toString()); 
       Log.i(TAG, "Received: " + extras.toString()); 
       Toast.makeText(getApplicationContext(), extras.toString(), Toast.LENGTH_LONG).show(); 
      } 
     } 
     // Release the wake lock provided by the WakefulBroadcastReceiver. 
     GcmBroadcastReceiver.completeWakefulIntent(intent); 
    } 

    // Put the message into a notification and post it. 
    // This is just one simple example of what you might choose to do with 
    // a GCM message. 

    private void sendNotification(String msg) { 
     mNotificationManager = (NotificationManager) 
       this.getSystemService(Context.NOTIFICATION_SERVICE); 

     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
       new Intent(this, DemoActivity.class), 0); 

     NotificationCompat.Builder mBuilder = 
       new NotificationCompat.Builder(this) 
         .setSmallIcon(R.drawable.ic_stat_gcm) 
         .setContentTitle("GCM Notification") 
         .setStyle(new NotificationCompat.BigTextStyle() 
           .bigText(msg)) 
         .setContentText(msg); 
      Toast.makeText(getApplicationContext(),msg,Toast.LENGTH_LONG).show(); 

     mBuilder.setContentIntent(contentIntent); 
     mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); 
    } 
} 
+0

См эту ссылку .. [Ссылка] (http://stackoverflow.com/questions/13716723/open-application-after-clicking-on-notification) – droidd

+1

Создать и отобразите его при получении сообщения GCM вместо уведомления. – WISHY

+0

использовать широковещательный приемник вместо ожидающего намерения – dipali

ответ

1

Обычный способ сделать это вещь через PendingIntent добавить его в свой Notification.Builder или Notification, например:

PendingIntent intent = PendingIntent.getActivity(context, 0, new Intent(context, HomeActivity.class), 0); 
notificationBuilder.setContentIntent(pendingIntent); 

Чтобы добавить Выдвижной ящик вы можете увидеть ПОЛЕЗНЫЕ this ответ

Edit:

Только что просмотрел ваш комментарий, чтобы начать работу, просто позвоните startActivity(); в ваш GcmIntentService, когда приложение прибыло соответствующее уведомление.

+0

спасибо. как я могу подготовить намерение для startActivity()? –

+0

@Shahab Intezari 'startActivity (новый Intent (getBaseContext(), YourDestinationActivity.class);' Btw, если он помогает принять ответ –

+0

, он говорит, что, к сожалению, GCM Demo перестала работать.затем убивает приложение. –

1

Вы можете сделать это с PendingIntent

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, new Intent(this, DemoActivity.class), 0); 

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
    .setSmallIcon(R.drawable.ic_stat_gcm) 
    .setContentTitle("GCM Notification") 
    .setStyle(new NotificationCompat.BigTextStyle() 
    .bigText(msg)) 
    .setContentText(msg); 

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

как в documentation

Если вы хотите, вы можете сделать свой DemoActivity диалог типа или что-то другое.

+0

спасибо, но я предполагаю, что вы объяснили, что пользователь должен нажать на уведомление, чтобы запустить эту операцию. Мне нужно, чтобы активность автоматически запускалась, как только сообщение GCM поступило независимо от того, какое приложение находится на переднем плане. –

+0

Итак, вам нужно создать новый Intent с активностью диалога и запустить его вместо этого кода, как обычно. – anil

+0

проблема в том, что startActivity не работает, я не знаю, почему –

0

используется имя пакета/класса непосредственно, например, чтобы создать новое намерение вызвать программу Twidroid вы бы использовать followinglink текст:

Intent intent = new Intent("com.twidroid.SendTweet"); 

Вы, вероятно, хотите поставить попробовать/обходите для ActivityNotFoundException, когда приложение не установлено.

0

Добавить это в GcmIntentService классе

@Override 
     protected void onHandleIntent(Intent intent) { 
      Bundle extras = intent.getExtras(); 
      GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this); 
      // The getMessageType() intent parameter must be the intent you received 
      // in your BroadcastReceiver. 
      String messageType = gcm.getMessageType(intent); 

      if (!extras.isEmpty()) { // has effect of unparcelling Bundle 
       if (GoogleCloudMessaging. 
         MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
        sendNotification("Send error: " + extras.toString()); 
       } else if (GoogleCloudMessaging. 
         MESSAGE_TYPE_DELETED.equals(messageType)) { 
        sendNotification("Deleted messages on server: " + 
          extras.toString()); 

       } else if (GoogleCloudMessaging. 
         MESSAGE_TYPE_MESSAGE.equals(messageType)) { 
        ** //Start your activity here .This will automatically launch your activity** 
       } 
      } 
Смежные вопросы