Android 在安卓系统中发出带有未决意图的警报
我遵循一个教程来构建一个android应用程序,它允许用户将时间(小时/分钟)存储到本地sqlite数据库中。存储的时间与日历时间一起检查,然后在时间等于当前时间时使用PendingEvent发出警报 下面是一些主要的代码做的工作Android 在安卓系统中发出带有未决意图的警报,android,Android,我遵循一个教程来构建一个android应用程序,它允许用户将时间(小时/分钟)存储到本地sqlite数据库中。存储的时间与日历时间一起检查,然后在时间等于当前时间时使用PendingEvent发出警报 下面是一些主要的代码做的工作 public class AlarmManagerHelper extends BroadcastReceiver { public static final String ID = "id"; public static final String NAME = "
public class AlarmManagerHelper extends BroadcastReceiver {
public static final String ID = "id";
public static final String NAME = "name";
public static final String TIME_HOUR = "timeHour";
public static final String TIME_MINUTE = "timeMinute";
public static final String TONE = "alarmTone";
public static final String ACTION_ALARM_CHANGED = "android.intent.action.ALARM_CHANGED";
@Override
public void onReceive(Context context, Intent intent) {
setAlarms(context);
}
public static void setAlarms(Context context) {
cancelAlarms(context);
AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();
if (alarms != null) {
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, alarm.timeHour);
calendar.set(Calendar.MINUTE, alarm.timeMinute);
calendar.set(Calendar.SECOND, 00);
//Find next time to set
final int nowDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
final int nowHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
final int nowMinute = Calendar.getInstance().get(Calendar.MINUTE);
boolean alarmSet = false;
//First check if it's later in the week
for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; ++dayOfWeek) {
if (dayOfWeek >= nowDay &&
!(dayOfWeek == nowDay && alarm.timeHour < nowHour) &&
!(dayOfWeek == nowDay && alarm.timeHour == nowHour && alarm.timeMinute <= nowMinute)) {
calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
setAlarm(context, calendar, pIntent);
alarmSet = true;
setStatusBarIcon(context, alarmSet);
break;
}
}
//Else check if it's earlier in the week
if (!alarmSet) {
for (int dayOfWeek = Calendar.SUNDAY; dayOfWeek <= Calendar.SATURDAY; ++dayOfWeek) {
if ( dayOfWeek <= nowDay && alarm.repeatWeekly) {
calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
calendar.add(Calendar.WEEK_OF_YEAR, 1);
setAlarm(context, calendar, pIntent);
alarmSet = true;
break;
}
}
}
}
}
}
}
@SuppressLint("NewApi")
private static void setAlarm(Context context, Calendar calendar, PendingIntent pIntent) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
}
}
public static void cancelAlarms(Context context) {
AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();
if (alarms != null) {
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pIntent);
}
}
}
}
public static void setStatusBarIcon(Context context, boolean enabled) {
Intent alarmChanged = new Intent(ACTION_ALARM_CHANGED);
alarmChanged.putExtra("alarmSet", enabled);
context.sendBroadcast(alarmChanged);
}
private static PendingIntent createPendingIntent(Context context, AlarmModel model) {
Intent intent = new Intent(context, AlarmService.class);
intent.putExtra(ID, model.id);
intent.putExtra(NAME, model.name);
intent.putExtra(TIME_HOUR, model.timeHour);
intent.putExtra(TIME_MINUTE, model.timeMinute);
intent.putExtra(TONE, model.alarmTone.toString());
return PendingIntent.getService(context, (int) model.id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
}
我在这个阶段失去了想法,请任何帮助将不胜感激。提前谢谢
更新
教程允许用户根据时间(例如小时和分钟)设置警报,但是我希望允许用户根据日期(例如日、月和年)设置警报
例如,如果用户将报警日期设置为2016年2月11日,则应在该日期到期时发出报警声。因此,在这种情况下,警报将在明天响起,因为明天是2016年2月11日。现在我想要一种方法,使这个条件工作,如上所述
感谢您的帮助我刚刚根据您的需要编辑了您的代码。警报日期为2016年2月11日。确保替换为数据库数据。我想您已经完成了
AlarmService
和AlarmScreen
课程。如果没有,你可以让我知道我会编辑。目前,AlarmManagerHelper
应该如下所示
public class AlarmManagerHelper extends BroadcastReceiver {
public static final String ID = "id";
public static final String NAME = "name";
public static final String TIME_HOUR = "timeHour";
public static final String TIME_MINUTE = "timeMinute";
public static final String TONE = "alarmTone";
@Override
public void onReceive(Context context, Intent intent) {
setAlarms(context);
}
public static void setAlarms(Context context) {
cancelAlarms(context);
AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH,11); //sample date
calendar.set(Calendar.YEAR,2016);//sample year. plz add yours from db
calendar.set(Calendar.MONTH,01);//sample month
calendar.set(Calendar.HOUR_OF_DAY, alarm.timeHour);
calendar.set(Calendar.MINUTE, alarm.timeMinute);
calendar.set(Calendar.SECOND, 00);
//Find next time to set
final int nowDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
final int nowHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
final int nowMinute = Calendar.getInstance().get(Calendar.MINUTE);
final int nowDate = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
final int nowMonth = Calendar.getInstance().get(Calendar.MONTH);
final int nowYear = Calendar.getInstance().get(Calendar.YEAR);
boolean alarmSet = false;
if(nowYear<=2016 && nowMonth<=01 && nowDate<=11 ) //change 2016,01,11 with user given data (from database)
{
if(nowHour<=alarm.timeHour)
{
if (nowMinute<alarm.timeMinute)
{
setAlarm(context, calendar, pIntent);
alarmSet = true;
}
}
}
}
}
}
@SuppressLint("NewApi")
private static void setAlarm(Context context, Calendar calendar, PendingIntent pIntent) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
}
}
public static void cancelAlarms(Context context) {
AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();
if (alarms != null) {
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pIntent);
}
}
}
}
private static PendingIntent createPendingIntent(Context context, AlarmModel model) {
Intent intent = new Intent(context, AlarmService.class);
intent.putExtra(ID, model.id);
intent.putExtra(NAME, model.name);
intent.putExtra(TIME_HOUR, model.timeHour);
intent.putExtra(TIME_MINUTE, model.timeMinute);
intent.putExtra(TONE, model.alarmTone.toString());
return PendingIntent.getService(context, (int) model.id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
}
公共类AlarmManagerHelper扩展广播接收器{
公共静态最终字符串ID=“ID”;
公共静态最终字符串NAME=“NAME”;
公共静态最终字符串TIME_HOUR=“timeHour”;
公共静态最终字符串TIME\u MINUTE=“timeMinute”;
public static final String TONE=“alarmTone”;
@凌驾
公共void onReceive(上下文、意图){
设置报警(上下文);
}
公共静态void setAlarms(上下文){
取消报警(上下文);
AlarmDBHelper dbHelper=新的AlarmDBHelper(上下文);
List alarms=dbHelper.getAlarms();
用于(报警型号报警:报警){
如果(报警。已启用){
PendingEvent pIntent=CreatePendingEvent(上下文、报警);
日历=Calendar.getInstance();
calendar.set(calendar.DAY,OF,11);//示例日期
calendar.set(calendar.YEAR,2016);//示例年份。请从数据库添加您的日历
calendar.set(calendar.MONTH,01);//示例月
calendar.set(calendar.HOUR\u OF_DAY,alarm.timeHour);
calendar.set(calendar.MINUTE、alarm.timeMinute);
日历.set(calendar.SECOND,00);
//寻找下一次设置
final int nowDay=Calendar.getInstance().get(Calendar.DAY/u周);
final int nowHour=Calendar.getInstance().get(Calendar.HOUR OF_DAY);
final int nowMinute=Calendar.getInstance().get(Calendar.MINUTE);
final int nowDate=Calendar.getInstance().get(Calendar.DAY,OF月);
final int nowMonth=Calendar.getInstance().get(Calendar.MONTH);
final int nowYear=Calendar.getInstance().get(Calendar.YEAR);
布尔报警集=假;
if(nowYear我刚刚根据您的需要编辑了您的代码。报警日期为2016年2月11日。请务必替换为您的数据库数据。我想您已经完成了AlarmService
和AlarmScreen
课程。如果没有,您可以告诉我我将进行编辑。目前,AlarmManagerHelper
应该如下所示
public class AlarmManagerHelper extends BroadcastReceiver {
public static final String ID = "id";
public static final String NAME = "name";
public static final String TIME_HOUR = "timeHour";
public static final String TIME_MINUTE = "timeMinute";
public static final String TONE = "alarmTone";
@Override
public void onReceive(Context context, Intent intent) {
setAlarms(context);
}
public static void setAlarms(Context context) {
cancelAlarms(context);
AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH,11); //sample date
calendar.set(Calendar.YEAR,2016);//sample year. plz add yours from db
calendar.set(Calendar.MONTH,01);//sample month
calendar.set(Calendar.HOUR_OF_DAY, alarm.timeHour);
calendar.set(Calendar.MINUTE, alarm.timeMinute);
calendar.set(Calendar.SECOND, 00);
//Find next time to set
final int nowDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
final int nowHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
final int nowMinute = Calendar.getInstance().get(Calendar.MINUTE);
final int nowDate = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
final int nowMonth = Calendar.getInstance().get(Calendar.MONTH);
final int nowYear = Calendar.getInstance().get(Calendar.YEAR);
boolean alarmSet = false;
if(nowYear<=2016 && nowMonth<=01 && nowDate<=11 ) //change 2016,01,11 with user given data (from database)
{
if(nowHour<=alarm.timeHour)
{
if (nowMinute<alarm.timeMinute)
{
setAlarm(context, calendar, pIntent);
alarmSet = true;
}
}
}
}
}
}
@SuppressLint("NewApi")
private static void setAlarm(Context context, Calendar calendar, PendingIntent pIntent) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
}
}
public static void cancelAlarms(Context context) {
AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();
if (alarms != null) {
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pIntent);
}
}
}
}
private static PendingIntent createPendingIntent(Context context, AlarmModel model) {
Intent intent = new Intent(context, AlarmService.class);
intent.putExtra(ID, model.id);
intent.putExtra(NAME, model.name);
intent.putExtra(TIME_HOUR, model.timeHour);
intent.putExtra(TIME_MINUTE, model.timeMinute);
intent.putExtra(TONE, model.alarmTone.toString());
return PendingIntent.getService(context, (int) model.id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
}
公共类AlarmManagerHelper扩展广播接收器{
公共静态最终字符串ID=“ID”;
公共静态最终字符串NAME=“NAME”;
公共静态最终字符串TIME_HOUR=“timeHour”;
公共静态最终字符串TIME\u MINUTE=“timeMinute”;
public static final String TONE=“alarmTone”;
@凌驾
公共void onReceive(上下文、意图){
设置报警(上下文);
}
公共静态void setAlarms(上下文){
取消报警(上下文);
AlarmDBHelper dbHelper=新的AlarmDBHelper(上下文);
List alarms=dbHelper.getAlarms();
用于(报警型号报警:报警){
如果(报警。已启用){
PendingEvent pIntent=CreatePendingEvent(上下文、报警);
日历=Calendar.getInstance();
calendar.set(calendar.DAY,OF,11);//示例日期
calendar.set(calendar.YEAR,2016);//示例年份。请从数据库添加您的日历
calendar.set(calendar.MONTH,01);//示例月
calendar.set(calendar.HOUR\u OF_DAY,alarm.timeHour);
calendar.set(calendar.MINUTE、alarm.timeMinute);
日历.set(calendar.SECOND,00);
//寻找下一次设置
final int nowDay=Calendar.getInstance().get(Calendar.DAY/u周);
final int nowHour=Calendar.getInstance().get(Calendar.HOUR OF_DAY);
final int nowMinute=Calendar.getInstance().get(Calendar.MINUTE);
final int nowDate=Calendar.getInstance().get(Calendar.DAY,OF月);
final int nowMonth=Calendar.getInstance().get(Calendar.MONTH);
final int nowYear=Calendar.getInstance().get(Calendar.YEAR);
布尔报警集=假;
如果(现在)你把“以下情况”称为什么你所说的“不工作”是什么意思?本教程的做法有什么问题?你能再解释一下你面临的问题吗?也许我已经阅读了该教程并使用了很多次。因此,如果你清楚地说明你的问题,我希望能帮到你@George@Da-JinC我只是用我的条件替换教程的条件。@ZahanSafallwa我已经更新了上面的解释。所以你想在特定年份的特定日期的00:00点设置警报。我没弄错吧,伙计?@george你把“以下情况”称为什么你所说的“不工作”是什么意思?本教程的做法有什么问题?你能再解释一下你面临的问题吗?也许我已经阅读了该教程并使用了很多次。因此,如果你清楚地说明你的问题,我希望能帮到你@George@Da-JinC我刚刚替换了教程condi
public class AlarmManagerHelper extends BroadcastReceiver {
public static final String ID = "id";
public static final String NAME = "name";
public static final String TIME_HOUR = "timeHour";
public static final String TIME_MINUTE = "timeMinute";
public static final String TONE = "alarmTone";
@Override
public void onReceive(Context context, Intent intent) {
setAlarms(context);
}
public static void setAlarms(Context context) {
cancelAlarms(context);
AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH,11); //sample date
calendar.set(Calendar.YEAR,2016);//sample year. plz add yours from db
calendar.set(Calendar.MONTH,01);//sample month
calendar.set(Calendar.HOUR_OF_DAY, alarm.timeHour);
calendar.set(Calendar.MINUTE, alarm.timeMinute);
calendar.set(Calendar.SECOND, 00);
//Find next time to set
final int nowDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
final int nowHour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
final int nowMinute = Calendar.getInstance().get(Calendar.MINUTE);
final int nowDate = Calendar.getInstance().get(Calendar.DAY_OF_MONTH);
final int nowMonth = Calendar.getInstance().get(Calendar.MONTH);
final int nowYear = Calendar.getInstance().get(Calendar.YEAR);
boolean alarmSet = false;
if(nowYear<=2016 && nowMonth<=01 && nowDate<=11 ) //change 2016,01,11 with user given data (from database)
{
if(nowHour<=alarm.timeHour)
{
if (nowMinute<alarm.timeMinute)
{
setAlarm(context, calendar, pIntent);
alarmSet = true;
}
}
}
}
}
}
@SuppressLint("NewApi")
private static void setAlarm(Context context, Calendar calendar, PendingIntent pIntent) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pIntent);
}
}
public static void cancelAlarms(Context context) {
AlarmDBHelper dbHelper = new AlarmDBHelper(context);
List<AlarmModel> alarms = dbHelper.getAlarms();
if (alarms != null) {
for (AlarmModel alarm : alarms) {
if (alarm.isEnabled) {
PendingIntent pIntent = createPendingIntent(context, alarm);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pIntent);
}
}
}
}
private static PendingIntent createPendingIntent(Context context, AlarmModel model) {
Intent intent = new Intent(context, AlarmService.class);
intent.putExtra(ID, model.id);
intent.putExtra(NAME, model.name);
intent.putExtra(TIME_HOUR, model.timeHour);
intent.putExtra(TIME_MINUTE, model.timeMinute);
intent.putExtra(TONE, model.alarmTone.toString());
return PendingIntent.getService(context, (int) model.id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
}