应用程序应该做的是从editReminder中获取一个字符串,并使用intent将其发送到AlarmManager。这是第一次成功。但是,当你关闭应用程序并重试时,通知不会使用你刚刚在编辑文本中键入的字符串,而是使用你第一次运行应用程序时键入的文本。
我们如何使新插入的文本显示在通知中,而不是旧文本?
MainActive:在按钮单击上执行的方法
public void setAlarm(View v) {
//get user input
EditText editText = (EditText) findViewById(R.id.editReminder);
String reminder = editText.getText().toString();
String snoozeString = getString(R.string.snooze_result);
//the AlarmManager
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
//get date and time
Calendar c = Calendar.getInstance();
//sets time for alarm
c.set(Calendar.YEAR, year);
c.set(Calendar.MONTH, month);
c.set(Calendar.DAY_OF_MONTH, day);
c.set(Calendar.HOUR_OF_DAY, hour);
c.set(Calendar.MINUTE, minute);
c.set(Calendar.SECOND, 0);
//pIntent to launch activity when alarm triggers
Intent intent = new Intent("com.garden.DisplayNotification"); //(1)From here to DisplayNotification ...
//DisplayNotification is the activity that is intended to be evoked
//sometimes you have to use (this,DisplayNotification.class)?
//when the alarm is triggered
//assign an ID of 1, and add the text
intent.putExtra("NotifID", 1);
intent.putExtra("notification", reminder); //("STRING_I_NEED",strname)
intent.putExtra("notifyAction", snoozeString); //string for the action button
//set the flags so the mainactivity isn't started when the notification is triggered
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent displayIntent = PendingIntent.getActivity(
getBaseContext(), 0,
intent, 0); //this intent instead of new Intent("com.garden.Reminder")
//sets alarm
alarmManager.set(AlarmManager.RTC_WAKEUP,
c.getTimeInMillis(), displayIntent);
showConfirmDialog(v);
}
DisplayNotification:在触发通知警报时执行
package com.garden.gardenapp;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
public class DisplayNotification extends Activity {
/**
* This activity is to display a notification only. It is called when
* the system alarm goes off.
*/
//called when activity is first created
//don't forget to update the manifest!!
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//get notification ID passed by MainActivity
int notifID = getIntent().getExtras().getInt("NotifID");
//----Oh of course, have to pass on the strings again.....-----
//initialize strings (reminder is also used for notification text
String reminderText = getIntent().getStringExtra("notification");
String snoozeString = getIntent().getStringExtra("notifyAction");
//pIntent to launch activity if user selects notification
/** making a new Intent has to be done with (this, Reminder.class) instead
* of ("com.garden.Reminder")... why? (otherwise the reminder text is not shown)
*/
Intent reminderIntent = new Intent(this, Reminder.class); //(2)... and from here to Reminder ...
reminderIntent.putExtra("NotifID", notifID);
//pass on strings again in the intent
reminderIntent.putExtra("notification", reminderText);
//intent.putExtra("notifyAction",snoozeString); //---> in different intent
PendingIntent reminderPIntent = PendingIntent
.getActivity(this, 0, reminderIntent, 0);
Intent actionIntent = new Intent(this, Reminder.class);
actionIntent.putExtra("notifyAction", snoozeString); //("STRING_I_NEED", strName)
//don't forget to pass the notifID also to the second intent
actionIntent.putExtra("NotifID",notifID);
PendingIntent actionPIntent = PendingIntent.getActivity(this,
(int) System.currentTimeMillis(), actionIntent, 0);
//create notification
Notification notif = new Notification.Builder(this) //build the notification
.setContentTitle(getString(R.string.app_name)) //required
.setContentText(reminderText) //required
.setSmallIcon(R.drawable.garden) //required
.setContentIntent(reminderPIntent)
//associate pendingIntent with a gesture of NotificationCompat.Builder: click
.addAction(R.drawable.pixel, "Snooze me", actionPIntent)
//should be addAction(NotificationCompat.Action action)
.setAutoCancel(true) //to be dismissed in the Reminder activity
.setPriority(Notification.PRIORITY_MAX) //to show the action buttons by default
// .setVibrate(new long[] {200, 600, 200, 600})
.build();
NotificationManager nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
nm.notify(notifID, notif); //(int id, Notification notification);
finish(); //because this doesn't have a GUI we don't need it anymore
}
}
(在DisplayNotification类中,我们将字符串分为两个意图,因此当您单击snooze(通知操作)按钮时,它触发的意图与单击通知时不同)
我们认为这与警报管理器没有更新带有意图或其他内容的字符串有关。因为当我们在没有警报管理器的情况下发出通知时,应用程序运行良好。如果您需要额外的代码,请告诉我。
我们找到了!您不需要取消报警管理器,但需要给意图一个标志flag\u UPDATE\u CURRENT,让报警管理器用您在意图中输入的新字符串更新意图。因此,在这种情况下,PendingIntent displayIntent
变为
PendingIntent displayIntent = PendingIntent.getActivity(
getBaseContext(), 0,
intent, PendingIntent.FLAG_UPDATE_CURRENT);
这就解决了更新字符串的问题。
我有一个简单的字符串,它有一个值。这个值来自生物识别提取器 我使用此代码消除多余字符: 但它只删除了~ DeviceName= 当我var_dump时,它有一个6字符串值,但它应该是5字符串值。 谢谢你的回答。下面的代码解决了我的问题。
问题内容: 我从文件中读取了编码为“ UTF-8”的字符串。我需要将其与表达式匹配。文件的第一个字符为,但字符串中的第一个字符为(空符号)。我已经将其翻译为具有字符集“ UTF-8”的字节,这里是。有谁知道它是什么以及如何使用正则表达式解决它? 问题答案: 一些编辑器(如记事本)在保存UTF-8文本时会添加BOM(字节顺序掩码)签名。从此类文件中读取字符串之前,应检查0xEF,0xBB,0xBF字
我认为每次更改字符串后,Python字符串的id都必须更改。但我发现真正的行为是不同的。例如,并非输出下面的所有代码字符串都不同: 这就是为什么我认为Python内核正在尝试优化代码,并开始对内存中的字符串进行奇怪的操作。该假设的另一个论点是,常量ID与大小为2的幂的段相关联: 但这其中还有一件奇怪的事。让我们看看随着字符串大小的增加,段大小会发生什么变化: 最后,我们可以尝试近似地将char添加
问题内容: 我需要一个类似于的函数,但可能会有多个空格,并且有意义的字符之间的空格数也不相同。像这样: 我可以以某种方式使用正则表达式来捕捉它们之间的空格吗? 问题答案: 如果您不向传递任何参数,它将把空格运行视为单个分隔符: 或者如果你想
...所以我有了@ApplicationScoped Bean“应用程序”: ...并想添加一个字符串到ArrayList Facelet如下所示: ...所以当我尝试添加“blabla@bla.com“,这是结果: 有一个删除按钮显示,但不是字符串本身 请帮忙!谢谢
问题内容: Python中替换字符串中字符的最简单方法是什么? 例如: 问题答案: 不要修改字符串。 与他们一起工作作为清单;仅在需要时才将它们转换为字符串。 Python字符串是不可变的(即无法修改)。有很多的原因。使用列表,直到你别无选择,然后将它们变成字符串。