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

尽管使用不同的ID,但无法启动多个挂起意图的实例

龙华翰
2023-03-14
package com.coffeetech.kittycatch;

import android.app.AlarmManager;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;

import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

public class NotificationBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        int type; // 0 for Daily reminder, 1 for Shopping reminder
        type = intent.getIntExtra("reminder", -1);

        //below code for action
        Intent postponeIntent, doneIntent;
        PendingIntent postponePendingIntent, donePendingIntent;

        postponeIntent = new Intent(context,NotificationActionReceiver.class);
        postponeIntent.setAction("postpone");
        postponeIntent.putExtra("type",type);

        doneIntent = new Intent(context,NotificationActionReceiver.class);
        postponeIntent.setAction("done");
        doneIntent.putExtra("type",type);

        //MAYBE THE PROBLEM IS IN THE BELOW 2 LINES
        postponePendingIntent = PendingIntent.getBroadcast(context,3,postponeIntent,PendingIntent.FLAG_CANCEL_CURRENT);
        donePendingIntent = PendingIntent.getBroadcast(context,4,doneIntent,PendingIntent.FLAG_CANCEL_CURRENT);



        //below code for user tap on notification
        Intent reminderIntent = new Intent(context, MainActivity.class);
        reminderIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, reminderIntent, 0);
        String title, text;

        switch (type) {
            case 0: //FOR EVERYDAY NOTIFICATIONS
                title = "Daily Reminder";
                text = "Time to update the quantities";
                break;
            case 1: //BELOW CODE TO MAKE AND SHOW SHOPPING NOTIFICATION
                title = "Shopping Reminder";
                text = "You need to buy certain things!";
                break;
            default:
                title = "ERROR";
                text = "in the Broadcast Receiver";
        }

        try {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(context, "kitty catch notification")
                    .setSmallIcon(R.drawable.ic_stat_name)
                    .setPriority(NotificationCompat.PRIORITY_HIGH)
                    .setContentIntent(pendingIntent)
                    .setAutoCancel(false)
                    .setAllowSystemGeneratedContextualActions(false)
                    .setContentTitle(title)
                    .setContentText(text)
                    .setCategory(NotificationCompat.CATEGORY_REMINDER)
                    .setLargeIcon(BitmapFactory.decodeResource(context.getPackageManager().getResourcesForApplication("com.coffeetech.kittycatch"), R.drawable.ic_launcher_foreground))
                    .addAction(R.drawable.ic_snooze, "POSTPONE", postponePendingIntent)
                    .addAction(R.drawable.ic_done, "DONE", donePendingIntent);

            // notificationId is a unique int for each notification that you must define
            NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
            notificationManager.notify(type, builder.build());

        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }
}

NotificationActionReceiver:

package com.coffeetech.kittycatch;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.widget.Toast;

import androidx.core.app.NotificationCompat;
import androidx.core.app.NotificationManagerCompat;

public class NotificationActionReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        int type = intent.getIntExtra("type", -1);

        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);

        //remove existing notification
        notificationManager.cancel(type);

        if(action == "done"){
            if(type == 1) {
                Intent doneIntent = new Intent("reset");
                doneIntent.putExtra("reset", true);
                context.sendBroadcast(doneIntent);
            }
        }else{
            Intent snoozeIntent = new Intent(context, NotificationBroadcastReceiver.class);
            snoozeIntent.putExtra("reminder", type);
            snoozeIntent.setAction("another notification");
            PendingIntent pendingIntent = null;
            //try {
                //pendingIntent = PendingIntent.getBroadcast(context.createPackageContext("com.coffeetech.kittycatch",0), 8, snoozeIntent, PendingIntent.FLAG_CANCEL_CURRENT);
                pendingIntent = PendingIntent.getBroadcast(context, 8, snoozeIntent, PendingIntent.FLAG_CANCEL_CURRENT);
            //} catch (PackageManager.NameNotFoundException e) {
              //  e.printStackTrace();
            //}
            int minutes = 1;
            AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            alarmManager.cancel(pendingIntent);
            alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + minutes * 60000, pendingIntent);
        }
    }
}

共有1个答案

仲学真
2023-03-14

每个悬而未决的意图都需要一个动作:

broadcastIntent.setAction("button1");

在广播接收器中,可以使用intent.getAction()捕捉意图。

希望这能有所帮助。

 类似资料:
  • 即使传递了相同的意图ID,我也无法检索相同的意图。 我已检查广播接收器在创建待定意图时使用的上下文是否完全相同。 创建PendingEvent时。 Logcat:

  • 这是设置u和删除通知的代码。如果你需要更多的细节,请告诉我。堆栈溢出的唯一解决方案是关于相同的挂起意图。我已经尝试过这个解决方案,但没有成功。

  • 我正在用Android开发一个报警应用程序。流程非常简单,我只是创建了一个pendingent,然后在AlarmManager中调用setExact()方法,如下所示。 经过一些测试,我意识到,使用上面的代码片段,我只能设置一个警报,因为我将PendingContent的requestCode设置为零,如果我将另一个警报的requestCode设置为0,那么它将覆盖前一个警报。有没有办法在不更改请

  • 问题内容: 我正在研究有效Java,在本书的第5项中,Joshua Bloch谈到了避免创建不必要的对象。一个示例演示了可变的Date对象,这些对象一旦计算出其值就永远不会被修改。 这里是“坏习惯”: isBabyBoomer方法每次调用时都不必要地创建新的Calendar,TimeZone和两个Date实例-这对我来说显然很有意义。 这里是改进的代码: 初始化时,Calendar,TimeZon

  • 我对TaskStackBuilder和用于通知的不同挂起内容的组合有问题。让我解释一下是关于什么的。 我有一个IntentService,它会在出现问题时发出通知。有时它会创建几个独立的通知。为什么我不像谷歌说的那样合并通知?因为每个通知都应该打开相同的活动,但在传递的意图中有不同的额外内容。所以,下面是一个学生应该做的: 用额外的东西创造新的意图: 现在是棘手的部分——我想用适当的后堆栈打开It

  • 我有一个活动,可以在收藏夹列表中添加书签。每个宠儿都有一个按钮。当我点击那个按钮时,我必须进入那个特定的活动。但它显示了一个错误。应用程序不会崩溃,但书签活动不会从单击开始。 以下是“收藏夹”活动的代码: 错误是onClick方法,具体如下: 它给我一个ClassNotFoundExc0019。 似乎有了这段代码,我就可以启动这个包中的活动了。但问题是,我想开始的活动在另一个包中。logcat说它