Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在安卓系统中发出带有未决意图的警报_Android - Fatal编程技术网

Android 在安卓系统中发出带有未决意图的警报

Android 在安卓系统中发出带有未决意图的警报,android,Android,我遵循一个教程来构建一个android应用程序,它允许用户将时间(小时/分钟)存储到本地sqlite数据库中。存储的时间与日历时间一起检查,然后在时间等于当前时间时使用PendingEvent发出警报 下面是一些主要的代码做的工作 public class AlarmManagerHelper extends BroadcastReceiver { public static final String ID = "id"; public static final String NAME = "

我遵循一个教程来构建一个android应用程序,它允许用户将时间(小时/分钟)存储到本地sqlite数据库中。存储的时间与日历时间一起检查,然后在时间等于当前时间时使用PendingEvent发出警报

下面是一些主要的代码做的工作

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);
}
}