Java Android具有多个通知和多个意图

Java Android具有多个通知和多个意图,java,android,android-notifications,Java,Android,Android Notifications,我有一个相当简单的应用程序,它接受用户的输入,然后将其设置为通知。用户可以创建任意数量的通知。我希望用户单击通知并进入名为ResultActivity的新活动ResultActivity依次读取通知意图中的putExtras,并将其显示给用户。下面的代码允许我做几乎所有我想做的事情,除了任何时候按下通知,我都会收到上次创建的通知的putExtra Intent notificationIntent = new Intent(ctx, MainActivity.class); PendingInt

我有一个相当简单的应用程序,它接受用户的输入,然后将其设置为通知。用户可以创建任意数量的通知。我希望用户单击通知并进入名为
ResultActivity
的新活动
ResultActivity
依次读取通知意图中的
putExtras
,并将其显示给用户。下面的代码允许我做几乎所有我想做的事情,除了任何时候按下通知,我都会收到上次创建的通知的
putExtra

Intent notificationIntent = new Intent(ctx, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx, i,notificationIntent,PendingIntent.FLAG_CANCEL_CURRENT);

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

Resources res = ctx.getResources();
NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx);
builder.setContentIntent(contentIntent)
    .setSmallIcon(R.drawable.ic_launcher)
    .setLargeIcon(BitmapFactory.decodeResource(res,R.drawable.ic_launcher))
    .setTicker("Remember to " + text.getText())
    .setWhen(System.currentTimeMillis()).setAutoCancel(true)
    .setContentTitle(text.getText());

// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(this, ResultActivity.class);
String pass = text.getText().toString();

resultIntent.putExtra("title", pass);
resultIntent.putExtra("uid", i);

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

new Uri.Builder().scheme("data").appendQueryParameter("text", "my text").build();
builder.setContentIntent(resultPendingIntent);

Notification n = builder.build();
n.flags = Notification.FLAG_NO_CLEAR;
nm.notify(i++, n);
text.setText(null);
  • 打开应用程序

  • 输入“一”

  • 点击ok

  • 通知已发送

  • 打开应用程序

  • 输入“两个”

  • 点击ok

  • 通知已发送

  • 现在您有两个通知。一个说“一”,一个说“二”。如果你点击通知“2”,它会带你进入一个显示“2”的屏幕。太好了

    如果你点击通知“一”,它会带你进入一个显示“二”的屏幕。坏了

    ResultActivity.java
    您创建了多个混合的意图。我清理了代码(但没有测试)


    我知道这是很久以前的事了,但我觉得答案并没有说明代码中的问题。 所以问题就在这里
    pendingent resultpendingent=stackBuilder.getpendingent(0,pendingent.FLAG_UPDATE_CURRENT)

    因此,您可以从stackbuilder中创建一个PendingEvent,其标志为update_current。如果你看一下当前的标志,它会说

     /**
     * Flag indicating that if the described PendingIntent already exists,
     * then keep it but replace its extra data with what is in this new
     * Intent. For use with {@link #getActivity}, {@link #getBroadcast}, and
     * {@link #getService}. <p>This can be used if you are creating intents where only the
     * extras change, and don't care that any entities that received your
     * previous PendingIntent will be able to launch it with your new
     * extras even if they are not explicitly given to it.
     */
    public static final int FLAG_UPDATE_CURRENT = 1<<27;
    
    /**
    *指示所述挂起内容是否已存在的标志,
    *然后保留它,但用新文件中的内容替换它的额外数据
    *意图。用于{@link#getActivity}、{@link#getBroadcast}和
    *{@link#getService} 如果您创建的意图中只有
    *额外的改变,不在乎任何实体收到你的
    *以前的Pending帐篷将能够与您的新产品一起推出
    *额外费用,即使没有明确规定。
    */
    
    公共静态最终整数标志_UPDATE_CURRENT=1设置不同的
    requestCode
    帮助我创建和更新当前意图

    val pendingIntent = PendingIntent.getActivity(
      this,
      notificationID,
      intent,
      PendingIntent.FLAG_UPDATE_CURRENT
    )
    

    使用一些随机请求代码来分隔两个通知

    PendingIntent pendingIntent = PendingIntent.getActivity(context, CommonTools.getRandomNumber(1, 100),
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
    public int getRandomNumber(int min, int max) {
        // min (inclusive) and max (exclusive)
        Random r = new Random();
        return r.nextInt(max - min) + min;
    }
    

    请不要转发问题,即使您删除了旧的问题。我希望以“正确”的方式进行。我刚刚尝试了更新当前,但我遇到了同样的问题。我还尝试添加
    notificationIntent.setAction(“ACTION”+System.nanoTime)但这也没有起作用。问题是一个应用程序显示一个通知(请查找“堆叠您的通知”)。如果您有多个通知,则应将它们收集到一个通知中。如果您需要显示多个通知,它们应该显示不同的数据。因此,在数据参数中设置您的数据不是额外的。对不起,我把它与您的几乎相同的问题混在一起了,我试图帮助您的地方…标题或多或少是id,添加“ACTION_”+System.currentTimeMillis()修复与我设置数据的目的相同,并且所有目的都是唯一的。或者更好地添加第二个参数,您可以将其调用到意图中(
    resultent.setData(新Uri.Builder().scheme(“数据”).appendQueryParameter(“文本”、“我的文本”)…appendQueryParameter(“时间”,String.valueOf(System.currentTimeMillis()).build();
    )只使用PendingEvent.FLAG\u一个镜头对我有效..这会产生任何其他问题吗?我为此损失了整整4个小时。
    resultIntent.setAction
    为我解决了它。谢谢!我在这方面损失了4个多小时,我不知道这是我一直面临的问题,非常感谢这个WA!!!我不知道为什么人们不投票给我这个答案p、 如果您使用相同的请求代码,它将只创建一个挂起的意图,并且在您下次使用相同的请求代码创建另一个意图时,它将每次更新。我已经尝试了此解决方案,它的效果非常好。谢谢,巴迪:)回答正确。谢谢
    val pendingIntent = PendingIntent.getActivity(
      this,
      notificationID,
      intent,
      PendingIntent.FLAG_UPDATE_CURRENT
    )
    
    PendingIntent pendingIntent = PendingIntent.getActivity(context, CommonTools.getRandomNumber(1, 100),
                notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
    public int getRandomNumber(int min, int max) {
        // min (inclusive) and max (exclusive)
        Random r = new Random();
        return r.nextInt(max - min) + min;
    }