2012-07-25 65 views
2

请原谅,如果这是一个noob问题。我尝试了每一种可能性,从五个编辑文本中每天设置五个警报。但没有任何工作!我还有一个按钮(在此代码中未显示)更新这些编辑文本(因此也应该更新闹钟时间)。这里是我的代码:每天设置五个闹铃,并通过点击按钮进行更新

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:晨礼,晌礼,ASR,昏礼,宵礼是五个EditTexts。我试图使用待处理的意图和警报管理器来触发警报,但它没有奏效。有没有人有很好的建议?

+3

什么没有奏效?让你的代码被触发?什么是“警报”,因为它看起来像一个AsyncTask? – 2012-07-25 22:58:40

+0

重写问题。清晰的沟通是第一步。你需要说出什么是错的,你的代码被触发的地点/方式,以及你是否使用AlarmManager。如果不是,你可能会模仿。 – 2012-07-25 23:24:50

+0

人们,请看上面的编辑。 – 2012-07-25 23:38:02

回答

2

所有你需要声明一个未决的意图每个警报的第一。所以,如果你想要5个闹钟,你需要运行5次

PendingIntent sender = PendingIntent.getBroadcast(context,intent_code, intent, 0); 

和intent_code也应该改变。每当你注册一个新的,你必须使用不同的代码。在我的应用程序中,每次执行时都会生成一个随机数。您也可以使用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由开发人员指南为recomended。将文件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(); 
    } 
+0

谢谢你的帮助,我会奖励你的赏金。 P.S:我会非常感激,如果你能演示如何播放MP3文件,而不是显示一个通知。 – 2012-08-11 22:18:33

+0

刚刚更新了我的答案。如果它适合你,请不要忘记接受它。我很高兴我能帮上忙! – caiocpricci2 2012-08-11 22:24:08

+0

对,谢谢! – 2012-08-11 22:25:55

1

它看起来像我试图在AsyncTask这样做的@Rafael_T建议。你需要做的是使用AlarmManager,并让它发送一个广播,当你要处理的警报关闭。 Here是一个很好的教程,如何做到这一点。

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

我很抱歉我的朋友,它不起作用。我是否需要在AlarmReceiver.class中设置相应的INTENT_CODE(例如:12345)?此外,作为我说我需要火灾报警每天五次,我应该做同样的事情对所有的人,也可以有一个更好/更有效的方式? – 2012-08-06 13:33:47

+0

如果它仅仅是报警,我觉得你可以重复此过程5次,只是改变calNew的价值。您不必设置新的INTENT_CODE。 – Wolfen 2012-08-09 18:31:33

+0

有关发件人什么= PendingIntent.getBroadcast(上下文,INTENT_CODE,意图,PendingIntent.FLAG_UPDATE_CURRENT);我应该简单地从它删除INTENT_CODE吗?那么AlarmReceiver.class呢? – 2012-08-09 18:52:38