2011-01-27 2 views
1

В моем приложении есть несколько файлов, но только 3 из них важны. Это приложение напоминания с звуком сигнала тревоги и уведомлениями. Я hava файл maincode.java, содержащий флажок и его прослушиватель. Если пользователь проверяет в chechbox, AlarmManager отправляет намерение AlarmReceiver.java, которое запускает MyService.java. MyService java содержит код о воспроизведении звука. Код является частичным. MyService.java:Android AlarmManager и вопрос обслуживания

public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 

    player = MediaPlayer.create(this, R.raw.sound); 
    player.setLooping(false); // Set looping 
} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 
    player.stop(); 
} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 
    player.start(); 
} 

AlarmReceiver.java:

public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 

    player = MediaPlayer.create(this, R.raw.sound); 
    player.setLooping(false); // Set looping 

Важная часть maincode.java:

cb1 = (CheckBox) findViewById(R.id.CheckBox01); 
    cb1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
     {   
      if (cb1.isChecked()) 
       { 
       if (GlobalVars.getHourOfDay() >= 0) 
       { 
        Toast.makeText(maincode.this, "ok", Toast.LENGTH_SHORT).show(); 
        rem1.setText(GlobalVars.getReminder1name()); 
         Intent intent = new Intent(maincode.this, AlarmReceiver.class); 
         PendingIntent pendingIntent = PendingIntent.getBroadcast(bInsulinReminder.this, 0, 
          intent, PendingIntent.FLAG_UPDATE_CURRENT); 
         AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
         Calendar cal = Calendar.getInstance(); 
         cal.set(Calendar.HOUR_OF_DAY, GlobalVars.getHourOfDay()); 
         cal.set(Calendar.MINUTE, GlobalVars.getMinute()); 
         cal.set(Calendar.SECOND, 0); 
         cal.set(Calendar.MILLISECOND, 0); 
         alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis()+ 3000, 6000, pendingIntent); 

       } 
       Toast.makeText(maincode.this, "Checked", Toast.LENGTH_SHORT).show(); 
       } else { 
        rem1.setText("No reminder set"); 
        Toast.makeText(maincode.this, "Not checked", Toast.LENGTH_SHORT).show(); 
       } 
     } 

     }); 

(REM1 кнопка напоминания, текст которой зависит от имени что угодно пользователю)

Проблема с кодом в том, что если я начну тревога, я не могу это остановить. Я знаю, что есть команда player.stop() в MyService.java, но как я могу назвать ее с конца maincode.java, где флажок снят?

ответ

3

Нет, вы не можете сделать это непосредственно у слушателя. Вы можете отключить будильник так:

Intent intent = new Intent(maincode.this, AlarmReceiver.class); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(bInsulinReminder.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
pendingItem.cancel(); 
alarmManager.cancel(pendingItem); 

Или, если (я полагаю) AlarmReceiver является реализацией BroadcastReceiver и от OnReceive методы вы начинаете свой MyService, который является реализацией класса обслуживания.

Итак, если вы хотите остановить эту тревогу изнутри вашего maincode.java прослушивателя, вы можете просто остановить MyService, воссоздав PendingIntent, который вы использовали в AlarmReceiver и выполнили метод stopService.

Надеюсь, что это поможет.