如果这是一个菜鸟问题,请原谅。我已尽可能地从五个编辑文本中每天设置五个警报。但没有任何效果!我还有一个按钮(此代码中未显示)更新这些编辑文本(因此也应更新警报时间)。这是我的代码:
for (int i = 0; i < 5; i++) {
switch (i) {
case 0:
fajr.setText(result[i]);
tFajr = new GregorianCalendar();
tFajr.set(year, month, day,
Integer.parseInt(result[i].substring(0, 2)),
Integer.parseInt(result[i].substring(3, 5)));
break;
case 1:
zuhr.setText(result[i]);
tZuhr = new GregorianCalendar();
tZuhr.set(year, month, day,
Integer.parseInt(result[i].substring(0, 2)),
Integer.parseInt(result[i].substring(3, 5)));
break;
case 2:
asr.setText(result[i]);
tAsr = new GregorianCalendar();
tAsr.set(year, month, day,
Integer.parseInt(result[i].substring(0, 2)),
Integer.parseInt(result[i].substring(3, 5)));
break;
case 3:
maghrib.setText(result[i]);
tMaghrib = new GregorianCalendar();
tMaghrib.set(year, month, day,
Integer.parseInt(result[i].substring(0, 2)),
Integer.parseInt(result[i].substring(3, 5)));
break;
case 4:
isha.setText(result[i]);
tIsha = new GregorianCalendar();
tIsha.set(year, month, day,
Integer.parseInt(result[i].substring(0, 2)),
Integer.parseInt(result[i].substring(3, 5)));
break;
}
}
P.S:fajr,zuhr,asr,maghrib,isha是五个EditTexts。我尝试使用待处理的意图和警报管理器来触发警报,但它没有用。有没有人有好的建议?
答案 0 :(得分:3)
首先,您需要为每个警报声明待处理的意图。因此,如果您需要5次报警,则需要运行5次
PendingIntent sender = PendingIntent.getBroadcast(context,intent_code, intent, 0);
并且intent_code也应该改变。每次注册新的时,都必须使用不同的代码。在我的应用程序中,每次执行时都会生成一个随机数。您还可以使用Intent将数据传递到此处。注意Intent和PendingIntent之间的区别。
Intent intent = new Intent(context, AlarmReceiver.class);
intent.putExtra("title", "some title");
intent.putExtra("notes","some notes");
Random r = new Random();
intent_code = r.nextInt();
PendingIntent sender = PendingIntent.getBroadcast(context,intent_code, intent, 0);
之后你需要注册你的闹钟。再次5次,每次触发一个警报就会触发。
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, Time_in_milis_from_now_till_your_alarm, sender);
您需要BroadcastReceiver才能接收警报并显示通知。我正在整课。这将在 Time_in_milis_from_now_till_your_alarm 中设置的时间后触发。你可以在这里运行任何你喜欢的东西。我不知道你想要什么样的警报,在我的情况下,我正在使用通知。您可以找到有关通知here和here的详细信息。
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("receiver", "received");
NotificationManager mManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Bundle b = intent.getExtras();
int icon = R.drawable.icon; // icon from resources
CharSequence tickerText = b.getString("title"); ; // ticker-text
long when = System.currentTimeMillis(); // notification time
CharSequence contentText = b.getString("notes");; // message text
Toast.makeText(context, tickerText, Toast.LENGTH_SHORT).show();
Intent notificationIntent = new Intent(context, AppDelegate.class);
// notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent contentIntent = PendingIntent.getActivity(context,
0,
notificationIntent,
Intent.FLAG_ACTIVITY_NEW_TASK);
// the next two lines initialize the Notification, using the
// configurations above
Notification notification = new Notification(icon, tickerText, when);
notification.setLatestEventInfo(context,tickerText, contentText, contentIntent);
mManager.notify(12, notification);
}
}
最后,不要忘记在清单中声明您的广播,否则它将无法正常工作。这在应用程序标签内部。
如果您对警报管理器方法有任何问题,可以找到文档here。
一切顺利!
修改强>
播放声音使用开发人员指南推荐的MediaPlayer。将文件mysound.mp3保存在您的文件夹/ res / raw中。你只需在BroadcastReceiver中调用以下方法!
public void playSound() {
MediaPlayer sound = MediaPlayer.create(this, R.raw.mysound);
sound.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
quadrantChangeSound.start();
}
答案 1 :(得分:1)
在我看来,你正试图在AsyncTask
中尝试这样做,因为@Rafael_T建议。您需要做的是使用AlarmManager
并让警报在您发出警报时发送广播。 Here是一个很好的教程,如何做到这一点。
答案 2 :(得分:0)
我开发了一些类似的应用程序。
我使用了一个AlarmManger来解决这个问题并且工作正常。 为了设置唤醒日期,我创建了一个日历对象。如果您想在第二天设置闹钟,则必须添加24小时。
这是你得到时间的方式:
Calendar calNew = Calendar.getInstance();
calNew.set(Calendar.HOUR_OF_DAY, hour);
calNew.set(Calendar.MINUTE, minute);
calNew.set(Calendar.SECOND, 0);
Calendar calNow = Calendar.getInstance();
// Get the AlarmManager service
if (calNew.getTimeInMillis() < calNow.getTimeInMillis()) {
calNew.add(Calendar.HOUR_OF_DAY, 24);
}
这就是你设置AlarmManager的方法:
// INTENT AND ALARMMANAGER PLANING
Intent intent = new Intent(context, AlarmReceiver.class);
sender = PendingIntent.getBroadcast(context, INTENT_CODE, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, calNew.getTimeInMillis(), sender);