当前位置: 首页 > 知识库问答 >
问题:

接收GCM消息时如何启动应用程序而不是构建通知?

司徒俊健
2023-03-14

我刚刚实现了一个GCM应用程序,它在GCM消息到达时显示通知。当消息到达时,如何启动应用程序?和viber一样。当消息到达时,你得到一个弹出框。

编辑:

非常感谢您的帮助,但我想你们大多数人都解释过需要用户单击通知才能启动应用程序。无论前台是什么应用程序,甚至当应用程序处于后台或基态时,我都需要在GCM消息到达后立即自动启动活动。

这是我的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());
    }
}

共有3个答案

骆鸿运
2023-03-14

您可以直接使用包名称/类,例如,创建一个新的意图来调用twidroid程序,您将使用以下链接文本:

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

您可能希望在未安装应用程序时对ActiveNotFoundException进行尝试/捕获。

乐正镜
2023-03-14

您可以使用pendingent

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());

如在文档中

如果你愿意,你可以把你的< code>DemoActivity做成对话框的样子或者别的什么。

景光赫
2023-03-14

做这件事的通常方法是通过PendingIntent将其添加到您的Notification.Builder通知例如:

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

要添加弹出框,您可能会看到此答案的帮助

编辑:

刚刚看到您的评论以便启动活动,当适当的通知到达时,请在您的GcmIntentService中调用start active();

 类似资料:
  • 我有一个应用程序,可以通过谷歌云消息接收消息。我需要在收到云消息时自动启动一个活动,必要时唤醒设备。 虽然它似乎是一个糟糕的UI设计,其中一些东西被有力地显示给用户,但这个应用程序对用户的工作是至关重要的,所以当一个云消息到达时,能够清楚地查看它对用户来说是更有用的。 当收到云消息时,我尝试调用,当应用程序位于后台时,它可以正常工作。但是,一旦该应用程序从最近的应用程序列表中删除,新活动就不会启动

  • 如果应用程序未运行,GCMinentService(扩展GCMBasEventService)不会收到通知。 来自:http://developer.android.com/about/versions/android-3.1.html 已停止应用程序上的启动控制请注意,系统会将标志\u排除\u已停止\u包添加到所有广播意图中。它这样做是为了防止来自后台服务的广播无意或不必要地启动已停止应用程序的

  • 几天前,我发布了这个问题,来自Azure IOT中心的短信 我曾尝试实现建议的logic app,我的问题是logic app没有通过服务总线接收任何消息,事实上没有消息到达服务总线。当我尝试在logic应用程序中运行触发器时,它会弹出一个对话框,告诉我“When_a_message_is_received_in_a_queue”。当我运行logic应用程序时,它说工作流程在几分钟后超时。 我复制

  • 我在玩春云流和RabbitMQ。 我有一个生成消息的RESTendpoint。 通过另一个应用程序,我正在消费这些消息。 当两个应用程序都启动并运行时。我可以发布消息并在消费者处使用它。 我在以下场景中面临的问题: 我故意让消费者失望,并通过制作人发布消息。现在,当消费者启动时,它没有收到任何消息 我想RabbitMQ保证消息传递 Github链接https://github.com/govi20

  • //以下代码不起作用。我从stackOverflow//PendingIntent PendingIntent=PendingIntent.getActivity(context,1,intent,0)中复制它; 没有错误,我希望有一个通知图标出现时,广播接收,但什么也没有发生。

  • 我在Android项目中使用推送通知(GCM)。 根据GCM教程,我实现了广播接收器,并将其注册到。 这种广播接收器应该接收消息,即使我的应用程序是关闭的(不仅如果我的应用程序是在后台,但即使它是强制停止)。 但它并不像我预期的那样有效<如果应用程序关闭,则不会调用code>onReceive()方法。看来我对广播接收机的理解是正确的,问题在于我对GCM的期望。 其中一个可能的原因是,如果应用程序