Java 使自定义通知的textView记住每个激发通知的特定字符串

Java 使自定义通知的textView记住每个激发通知的特定字符串,java,android,notifications,Java,Android,Notifications,问题摘要: 我有一个listView,它存储了单词记忆类、NotificationWorker类和NotificationReceiver类中的词汇表,用于处理通知。我的目标是点击一个项目,例如listView中的一个名为Basketball的单词,该项目将触发一个时间选择器,我将在其中设置一个特定的时间,比如说,5个弹药后触发一个通知。通知出现时,应该显示一个标题:你还记得这个词吗:棒球。当我只发出一个通知时,通知会正常工作,但是如果我立即为另一个单词(如apple)发出第二个通知,第一个和第

问题摘要: 我有一个listView,它存储了单词记忆类、NotificationWorker类和NotificationReceiver类中的词汇表,用于处理通知。我的目标是点击一个项目,例如listView中的一个名为Basketball的单词,该项目将触发一个时间选择器,我将在其中设置一个特定的时间,比如说,5个弹药后触发一个通知。通知出现时,应该显示一个标题:你还记得这个词吗:棒球。当我只发出一个通知时,通知会正常工作,但是如果我立即为另一个单词(如apple)发出第二个通知,第一个和第二个通知的标题都会变成“你还记得这个单词吗:apple?”。我的意思是当这两个通知出现时,第一个应该是棒球,第二个应该是苹果。问题是,当我发出第二次通知时,棒球已经被替换了

那么,有没有一种方法可以让通知记住它们的具体单词呢

我尝试过的事情: 我尝试为每个通知设置不同的通知id,但没有成功。我想生成一个时间标签,当点击棒球或listView中的任何其他项目时,获取当前系统时间,并让通知管理器将时间标签和棒球配对,这样将是棒球的标识符,因此通知可以记住这个词。然而,这远远高于我的编码水平,我不知道如何在代码中实现这一点

以下是我的代码供参考:

单词记忆课

NotificationReceiver类


我认为这可能确实与通知的ID有关。你可以试试:

简单通知id需要可更改

只需为通知id创建随机数

Random random = new Random();
int m = random.nextInt(9999 - 1000) + 1000; 
或者,您可以使用此方法创建tieorange告知的随机数 永远不要重复:

int m = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE); and replace this line to add parameter for
用于生成随机数的通知id

notificationManager.notify(m, notification);

让我知道它是否有效

正如我在评论中所建议的,您可以使用LinkedList作为队列:

替换

static String vocabularyToBeMemorized;
用你的话记住课堂上的内容:

static LinkedList vocabulariesToBeMemorized = new LinkedList<String>(); 
并简单地替换

final String vocabularyToBeMemorizedFromNotification = intent.getStringExtra("vocabularyToBeMemorized");

并在生成器中使用它来设置标题

builder.setTitle(wordToMemorize);
希望有帮助

编辑:请使用

静态LinkedList VocabulariesTobeMemored=新建LinkedList

另外,我实际上试图建议您不要使用任何intent.puttera或intent.getStringExtra,而是使用作为队列的静态LinkedList替换它。如果您这样做,并使用wordToMemorize在showNotification方法中设置标题,我认为它可能会起作用


我试着为你制作一个小应用程序来证明我的意思。现在,我不确定发布新通知的等待时间可能有多长,例如,如果时间是一周,您可以按照建议查看AlarmManager,而不是像我现在这样使用处理程序

现在,转到应用程序。这是一个至少有两个按钮的工作示例,蝴蝶和棒球:

使用两个按钮进行main活动

用于处理通知的自定义NotificationManager:


我测试了这个应用程序,它似乎工作得很好

你好,乔恩。不幸的是,这没有成功。实际上,我已经使用了一个时间戳方法来生成通知id作为系统时间,它是NotificationWorker类中的public int createID。第一次和第二次通知分别出现,但显示的标题相同,这是不可取的。我猜问题在于广播意图。puteExtravocabulary to ememorized,words to memory.vocabulary to emorized;在NotificationWorker类中。当触发新通知时,WordsToMemory类中的WordsToMemory.VocabularyToBeemorized字符串将被替换为新字符串。我认为每当触发新通知时,必须以某种方式存储该字符串,当触发以下通知时,该字符串将被替换为也必须存储的新字符串。挑战在于通知管理器必须告诉哪个字符串是哪个通知的字符串,并确保通知与正确的字符串配对。顺便说一下,该字符串是myVocabularyListview项的值。我只是在努力寻找痛点。如果我看错了方向,请纠正我。啊,我现在确实明白了。我认为你的方向是正确的。我建议使用队列来存储您希望在通知中使用的单词。通知的延迟一直是一样的,对吗?您可以使用LinkedList来实现这一点,请参阅下面我的答案。谢谢Jorn。不过有一个新问题。现在每个通知标题都变成了你还记得这个词吗:null。我所做的是将静态字符串词汇替换为静态链接列表词汇
StobeMemored=new LinkedList,将Vocabulary TobeMorized=MainActivity.wordInputView.getText.toString替换为最终字符串Vocabulary TobeMorizedFromNotification=intent.GetStringExtravocabulary TobeMorized。此时,出现了一条警告,说VocabulariesTobeMemored.add是一个未经检查的调用,我忽略了它。在最后一步中,我将最终字符串Vocabulary TobeMorizedFromNotification=intent.GetStringExtravocabulary TobeMorized替换为建议的代码。这时有一条警告说不兼容的类型。必需的字符串,但找到了对象,因此我强制转换为字符串:wordToMemorize=string VocabulariesTobeMemory.poll。然后一个警告出现了,说变量WordToMorize被分配了,但从未访问过。在处理程序部分中,我将MainActivity.wordInputView.SettextVocabulary从通知更改为MainActivity.wordInputView.SettextWordToMorize,并将WordToMorize复制到最终临时变量,否则Android Studio会认为WordToMorize需要声明为最终。生成的处理程序部分现在变成:Handler Handler=new Handler;最终字符串finalWordToMemorize=wordToMemorize;handler.postDelayednew Runnable{public void run{MainActivity.wordInputView.SettextFinalWordToMorize;我实际上使用了两个自定义布局,一个用于普通,另一个用于扩展的通知视图;因此在NotificationWorker类中存在RemoteView,我在其中设置了通知的标题。但无论如何,我仍然添加了builder.SetTitleWordToMorize;正如你建议了,上面提到的新问题仍然存在。我们需要做进一步的修改吗?嗨,Dean,我更新了一下我的答案。你得到的目标是因为LinkedList没有显式类型,我的错。如果LinkedList VocanualistoBemembered已经记住,那么我想你是在建议用按钮和获取按钮的文本并将其设置为通知的标题。这完全有道理。在我的情况下,因为我需要点击词汇表中的一项,即myVocabularyListview来创建通知,我可能需要在列表下方添加一个按钮,并将按钮的文本设置为点击列表项的文本,然后设置否tification title作为按钮的文本。但有一个问题,如果我一次连续快速点击列表中的所有项目,将所有项目置于通知队列中,并且如果这些项目中的每一个都必须在1天、1周和1个月后的多个时间点创建通知,会不会弄乱按钮的文本和通知的标题ion,这意味着通知会出现错误的标题?我想要实现的功能的核心是使用词汇表、通知管理器、可能是您建议的按钮和多个定时来触发通知。我需要点击词汇表中的任何一个单词,让应用程序通知我重新记忆一个单词在1天、1周和1个月之后。我想知道这个愿望是否可行LOLHey Dean。对于1天、1周或1个月之后的通知,我建议使用AlarmManager,而不是我在帖子中建议的。关于onClick方法,您可以在listView项上设置onClick侦听器,并从该特定项检索文本,无需任何按钮ns或任何你幸运的东西。在这种情况下,单击多个项目不会有问题。如果答案对你有帮助,请表现出一些爱心;
static LinkedList vocabulariesToBeMemorized = new LinkedList<String>(); 
vocabulariesToBeMemorized.add(MainActivity.wordInputView.getText().toString());
final String vocabularyToBeMemorizedFromNotification = intent.getStringExtra("vocabularyToBeMemorized");
String wordToMemorize = "";
if (WordsToMemorize.vocabulariesToBeMemorized.peek() != null) {
     wordToMemorize = vocabulariesToBeMemorized.poll();
}
builder.setTitle(wordToMemorize);
public class MainActivity extends AppCompatActivity {

    Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final Button baseballBtn = findViewById(R.id.baseball);
        baseballBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                postDelayedNotification(baseballBtn);
            }
        });

        final Button butterflyBtn = findViewById(R.id.butterfly);
        butterflyBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                postDelayedNotification(butterflyBtn);
            }
        });
    }

    private void postDelayedNotification(Button button) {
        final String message = "Do you remember this word: " + button.getText();

        if (handler == null) {
            handler = new Handler();
        }
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                // Do something after 5s = 5000ms
                MyNotificationManager.showNotification(getApplicationContext(), message);
            }
        }, 3000); // delay for how long you want (you can use the set calendar here)
    }
}
class MyNotificationManager {

    public static void showNotification(Context applicationContext, String message) {
        NotificationManager manager = (NotificationManager) applicationContext.getSystemService(Context.NOTIFICATION_SERVICE);

        if (manager != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel channel = new NotificationChannel("simplfiedcoding", "simplfiedcoding", NotificationManager.IMPORTANCE_DEFAULT);
                manager.createNotificationChannel(channel);
            }

            // In this builder, you could set your actionIntents etc. as you had in your application
            NotificationCompat.Builder builder = new NotificationCompat.Builder(applicationContext, "simplfiedcoding")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentTitle("New Message")
                    .setContentText(message)
                    .setPriority(NotificationCompat.PRIORITY_DEFAULT);

            int uniqueId = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE);
            manager.notify(uniqueId, builder.build());
        }
    }

}