每天设置五个警报,并通过单击按钮更新它们

时间:2012-07-25 22:54:17

标签: android android-alarms

如果这是一个菜鸟问题,请原谅。我已尽可能地从五个编辑文本中每天设置五个警报。但没有任何效果!我还有一个按钮(此代码中未显示)更新这些编辑文本(因此也应更新警报时间)。这是我的代码:

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。我尝试使用待处理的意图和警报管理器来触发警报,但它没有用。有没有人有好的建议?

3 个答案:

答案 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 中设置的时间后触发。你可以在这里运行任何你喜欢的东西。我不知道你想要什么样的警报,在我的情况下,我正在使用通知。您可以找到有关通知herehere的详细信息。

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