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

从谷歌云消息接收器传递额外意图到活动为null

凌通
2023-03-14

我有一个广播接收器,可以监听云消息,我可以很好地显示通知,但是当用户点击通知时,我想将它们路由到正确的活动,并带有额外的意图。额外的总是空的。

我可以验证在调试时传递给pending intent的意图是否有额外的内容。

我试图了解activites onCreate()方法中的意图

***编辑添加工作代码,有几件事需要注意,如果任务已经开始,你不能指望调用oncreate()方法,所以最好的地方是在on简历方法中获得额外的功能。我需要在意图和挂起的意图上设置标志

@EReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {

private static final String TAG = "googlecloudmessage";
private static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
private NotificationCompat.Builder builder;
private Context ctx;

@Pref
public MyPrefs_ myPrefs;

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

    Log.d(TAG, "received gcm message");

    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
    this.ctx = context;

    String messageType = gcm.getMessageType(intent);

    if (messageType != null) {

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

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

        }
        else if (messageType.equalsIgnoreCase("gcm")) {
            myPrefs.notification().put(true);
            handleNotification(intent);
        }
    }
    setResultCode(Activity.RESULT_OK);
}

private void handleNotification(Intent intent) {

    Bundle bundle = intent.getExtras();

    String typeString = bundle.getString("type");
    String icon = bundle.getString("icon");

    String title = null;
    String body = null;
    Class<?> intentClass = null;
    Integer intentExtraId = null;

    if (typeString == null)
        return;

    int type = Integer.parseInt(typeString);

    switch (type) {

    case 1:

        intentClass = FriendsActivity_.class;

        title = bundle.getString("username");

        break;

    case 2:

        intentClass = UserProfileActivity_.class;

        title = bundle.getString("username");

        intentExtraId = Integer.parseInt(bundle.getString("user_id"));

        break;




    }


    mNotificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);


Intent i = new Intent();
    i.setClass(ctx, intentClass);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP     | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.putExtra("gcm", true);
    if (intentExtraId != null) {

        i.putExtra("id", intentExtraId);
    }

    int requestID = (int) System.currentTimeMillis();

    PendingIntent pendingIntent = PendingIntent.getActivity(ctx, requestID, i,     PendingIntent.FLAG_UPDATE_CURRENT);

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

    mBuilder.setSmallIcon(R.drawable.ic_stat_u);

    Bitmap bmp = null;

    try {
        bmp = Ion.with(ctx, ctx.getResources().getString(R.string.image_container) + icon).asBitmap().get();
    }
    catch (InterruptedException e) {

        e.printStackTrace();
    }
    catch (ExecutionException e) {

        e.printStackTrace();
    }

    if (icon != null) {
        mBuilder.setLargeIcon(bmp);
    }

    mBuilder.setContentTitle(title).setStyle(new NotificationCompat.BigTextStyle().bigText(body))
            .setContentText(body);

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

}

}

活动

 @Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

@Override
protected void onResume() {

    super.onResume();

    Integer newId = getIntent().getExtras().getInt("id");

    id = newId;


}

共有3个答案

白才艺
2023-03-14

你可以试试这个。它是:https://developers.google.com/cloud-messaging/android/start

@Override
public void onMessageReceived(String from, Bundle data) {
    String message = data.getString("message");
    Log.d(TAG, "From: " + from);
    Log.d(TAG, "Message: " + message);

    if (from.startsWith("/topics/")) {
        // message received from some topic.
        sendNotification(message)
    } else {
        // normal downstream message.
    }

    // ...
}

/////////添加此方法

private void sendNotification(String message) {
    Intent intent = new Intent(this, ListLocations.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.drawable.ic_park_notification)
            .setContentTitle("Parkuest Message")
            .setContentText(message)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
酆光熙
2023-03-14

你做了简单的通知。然后点击这个。在下面的示例中,将活动粘贴到主活动的位置

public void createNotification(Context context, String payload, String message) {
    try {
        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notification = new Notification(R.drawable.ic_launcher, message, System.currentTimeMillis());
        // Hide the notification after its selected
        // notification.flags |= Notification.FLAG_AUTO_CANCEL;
        notification.ledARGB = 0xff00ff00;
        notification.ledOnMS = 300;
        notification.ledOffMS = 1000;
        notification.flags |= Notification.FLAG_SHOW_LIGHTS;

        Intent intent = new Intent(context, YourMainActivity.class);
        intent.putExtra("payload", payload);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.putExtra("NotifID", 1);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
        PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        notification.setLatestEventInfo(context, "Message", message, pendingIntent);
        notification.defaults |= Notification.DEFAULT_SOUND;
        notification.defaults |= Notification.DEFAULT_VIBRATE;
        notificationManager.notify(0, notification);
    } catch (Exception e) {

            Log.e(this.getClass().getSimpleName(), e.getMessage(), e);

    }
}

如果有帮助,请标记为true或投票

阴波峻
2023-03-14

这是您用来获取挂起内容的呼叫:

PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, i, 0);

如果系统中已经有一个匹配的PendingIntent,这个调用将只返回那个。它可能包含也可能不包含您想要的额外内容。为了确保您的额外内容被使用,您必须确保更新任何当前的PendingIntent,像这样:

PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
 类似资料:
  • 我有一个很奇怪的问题。 我正在发送广播并设置一些额外内容,但接收者没有收到: 发送: 并收到: 由于某些原因,downloadID为空。有什么提示吗? 谢谢

  • 上面写着“Google Cloud Messaging(GCM)是一个免费服务”,但是为了使它能够运行,我需要在Google Cloud平台中创建一个项目,这需要花钱…那怎么免费呢?还是我错过了什么?

  • null null 谢谢!!!

  • 我已经扫描了存储转移文档,但我没有看到这种情况的示例。作为参考,我使用以下脚本--https://github.com/googlecloudplatform/python-docs-samples/blob/master/storage/transfer_service/nearline_request.py 例如,如果我在源桶中有这个文件: 我想给它添加一个前缀,以便它在接收器桶中看起来像这样

  • 我想把意图转移到Xamarin.Android中的另一个活动。基本上,我需要Intent.data和Intent.clipdata到另一个活动,所以我使用下面的代码来传输Intent,但我不知道检索它的正确方法。 下面是Main Activity中的代码 在第二活动中 如何在第二个活动中检索意图?

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