如何清除从 Android 中点击通知打开的先前活动?

Posted

技术标签:

【中文标题】如何清除从 Android 中点击通知打开的先前活动?【英文标题】:How can I clear previous activity which is open from the tap on notification in Android? 【发布时间】:2020-02-17 13:45:18 【问题描述】:

有一个提醒应用程序。现在用户创建了 5 个提醒。 R1、R2、R3、R4、R5。

对于所有提醒时间都是一样的。所以所有的提醒都是在同一时间出现的。现在我点击通知,即 R1。当我点击时,它会打开一个特定的活动并根据详细信息显示,因为我在意图中发送了该提醒的 Id。

现在我点击R2/R3/R4/R5,它只是根据R1而不是R2/R3/R4/R5打开细节。

注意:在 onReceive 中,我从中创建通知。此外,对于所有提醒,我打开相同的活动,但该活动的详细信息应根据提醒 ID 有所不同。另外,当我意图发送 ReminderId/mReceivedId 时,正确,不一样。

代码:

editIntent = new Intent(context, ReminderDetailActivity.class);
editIntent.putExtra(REMINDER_ID, mReceivedId);
editIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
editIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
pendingIntent = PendingIntent.getActivity(context, rowId, editIntent, 0);

完整代码(我从 onReceive 调用 createNotification()):

private void createNotification() 
    int rowId = getRowId(mReceivedId);
    Uri mUri;
    if (preferenceManager.getRingtoneUri() != null) 
        mUri = Uri.parse(preferenceManager.getRingtoneUri());
     else 
        mUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    
    String mTitle = reminder.getTitle();
    String id = "1";
    PendingIntent pendingIntent;
    NotificationCompat.Builder builder;
    if (mNotificationManager == null) 
        mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    
    Intent editIntent;
    if (SDK_INT >= Build.VERSION_CODES.O) 
        int importance = NotificationManager.IMPORTANCE_HIGH;
        assert mNotificationManager != null;
        NotificationChannel mChannel = mNotificationManager.getNotificationChannel(id);
        if (mChannel == null) 
            mChannel = new NotificationChannel(id, mTitle, importance);
            mChannel.enableVibration(true);
            mChannel.setVibrationPattern(new long[]100, 200, 300, 400, 500, 400, 300, 200, 400);
            mNotificationManager.createNotificationChannel(mChannel);
        
        builder = new NotificationCompat.Builder(context, id);
        editIntent = new Intent(context, ReminderDetailActivity.class);
        editIntent.putExtra(REMINDER_ID, mReceivedId);
        editIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        editIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        pendingIntent = PendingIntent.getActivity(context, rowId, editIntent, 0);
        builder.setContentTitle(mTitle)

                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
                .setContentTitle(mTitle)
                .setSmallIcon(R.drawable.ic_alarm_black_24dp)
                .setSound(mUri)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .setCategory(NotificationCompat.CATEGORY_REMINDER)
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText("Have you completed your task?"))
                .setBadgeIconType(NotificationCompat.BADGE_ICON_LARGE)
                .addAction(R.drawable.ic_icon_alarm, context.getString(R.string.pay_now), pendingIntent);
        builder.setColor(ContextCompat.getColor(context, R.color.colorPrimary));


     else 
        builder = new NotificationCompat.Builder(context, id);
        editIntent = new Intent(context, ReminderDetailActivity.class);
        editIntent.putExtra(REMINDER_ID, mReceivedId);
        editIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
        editIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        editIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        pendingIntent = PendingIntent.getActivity(context, rowId, editIntent, 0);
        builder.setContentTitle(mTitle)

                .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher))
                .setContentTitle(mTitle)
                .setSmallIcon(R.drawable.ic_alarm_black_24dp)
                .setSound(mUri)
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .addAction(R.drawable.ic_icon_alarm, context.getString(R.string.pay_now), pendingIntent)
                .setCategory(NotificationCompat.CATEGORY_REMINDER)
                .setStyle(new NotificationCompat.BigTextStyle()
                        .bigText("Have you completed your task?"))
                .setBadgeIconType(NotificationCompat.BADGE_ICON_LARGE)
                .setPriority(Notification.PRIORITY_HIGH);

        builder.setColor(ContextCompat.getColor(context, R.color.colorPrimary));
    

    Notification notification = builder.build();
    mNotificationManager.notify(rowId, notification);

【问题讨论】:

你能告诉我你处理这些额外内容的代码吗? 您是否在通话前完成活动并打算进行另一项活动? @Piyush 这不是设置警报的待定意图,这仅用于创建通知 @PoojaSingh 但是如果你从通知开始,你想清除以前的活动吗?将 pendingIntent = PendingIntent.getActivity(context, rowId, editIntent, 0); 改为 pendingIntent = PendingIntent.getActivity(context, rowId, editIntent, PendingIntent.FLAG_UPDATE_CURRENT);跨度> @JawadMalik 通知创建正确,没有dobut,因为我设置了标题名称,这是准确的。 【参考方案1】:

欢迎来到代码派对?

正如我所见,你想在另一个活动已经打开并且它无法获得其他额外内容时开始一个活动。

因此,您必须在发送另一个意图之前,清除捆绑包或完成活动。

已编辑:

在你的活动中使用它

@Override
protected void onNewIntent(final Intent intent) 
    super.onNewIntent(intent);
    this.setIntent(intent); //just add this line when overrided

这样做并更新我

【讨论】:

其他活动是一样的,我不会根据提醒ID打开不同的不同活动。请张贴代码。我应该从哪里完成活动? 你从哪里得到额外的东西? public void onReceive(Context context, Intent intent) mReceivedId = intent.getLongExtra(REMINDER_ID, 0); 来自 onReceive 意图 超越 onNewIntent 并在上面使用此代码并告诉我发生了什么

以上是关于如何清除从 Android 中点击通知打开的先前活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何从点击通知列表中清除单个通知?

如何清除状态栏上的推送通知警报 - android

如何知道应用程序是不是从 android 通知托盘打开?

android 如何让通知不被清除或者点击后不消失

android 如何让通知不被清除或者点击后不消失?

点击时清除横幅通知