2016-08-25 2 views
0

논리가 예상대로 작동하지 않기 때문에 AlarmManager을 사용하여 응용 프로그램에서 구현 한 논리를 이해하는 데 도움이 필요합니다. 나는 안드로이드 개발과 자기 학습자가 처음이다.내 AlarmManager 논리 이해하기

논리 :

사용자가 버튼을 사용하여 주요 활동에 시간을 선택합니다.

시간 값은 다른 활동에서 반복 알람을 설정하는 데 사용됩니다.

알람이 울릴 때 대화 상자가 나타납니다.

주요 활동 : 상기 로직이 다른 활동에 의해 사용될 수 있도록 사용자에 의해 선택된 시간 공용 정적 변수 밀리 변환 및 저장에

static long ATfrom_to_millisec; 

case R.id.ATfrom: 

     final Calendar ATfromC = Calendar.getInstance(); 
     ATfromHour = ATfromC.get(Calendar.HOUR_OF_DAY); 
     ATfromMinute = ATfromC.get(Calendar.MINUTE); 

     // Launch Time Picker Dialog 
     TimePickerDialog ATfromtpd = new TimePickerDialog(MainActivity.this, 
       new TimePickerDialog.OnTimeSetListener() { 

        @Override 
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) { 

         //Converting to milli seconds to use in AlarmManager 

         ATfrom_to_millisec = ((hourOfDay * 60 * 60 * 1000) + (minute * 60 * 1000)); 

         String AM_PM; 
         if (hourOfDay < 12) { 
          AM_PM = "AM"; 
         } else { 
          AM_PM = "PM"; 
          if (hourOfDay > 12) { 
           hourOfDay = hourOfDay - 12; 
          } 
         } 

         if (minute < 10) { 
          ATfrom.setText(hourOfDay + ":0" + minute + " " + AM_PM); 
         } else { 
          ATfrom.setText(hourOfDay + ":" + minute + " " + AM_PM); 
         } 

.

알람 작업 :이 설정하고 1 분 간격으로 반복되면 알람은 상기 구현 된 로직을 설정

public void onClick(View arg0) { 
    // TODO Auto-generated method stub 

    switch (arg0.getId()){ 

    case R.id.bReminder: 
     try { 
      //Receiving the static variable's value from MainActivity 
      long AT_from = MainActivity.ATfrom_to_millisec; 
      float cov = (float)(AT_from/1000/60/60); 
      //Toast to check if the time value is passed correctly 
      toast.makeText(getApplicationContext(), String.valueOf(cov), toast.LENGTH_SHORT).show(); 

      Intent intent = new Intent(this, Notifier.class); 
      PendingIntent pendingIntent = PendingIntent.getActivity(this.getApplicationContext(), 
       12345, intent, 0); 
    //Logic for Repeating Alarm that uses the time value from MainActivty as starting time and repeating it every 10 seconds. 
    // i.e. the alarm should go off after 10 seconds from the use selected time and repeat after 10 seconds. 
      AlarmManager am = 
       (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
      am.setRepeating(AlarmManager.RTC_WAKEUP, AT_from + (10*1000), 10*1000, pendingIntent); 


      } catch (Exception e) {} 

     break; 

    case R.id.bReminderStop: 
     AlarmManager am = 
     (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
     am.cancel(pendingIntent); 

     break; 

    } 
} 

경보는 즉시로 진행한다. 그러나 사용자가 설정 한 시간부터 10 초 후에 10 초마다 반복되는 알람을 내 논리에서 구현했습니다. 논리에서 구현 한 실수를 이해할 수 없습니다. 또한 토스트에 나는 플로트 COV 의 진수 값을 받고 있지 않다 (예 : 오후 11시 반은 23.5로 표시해야 나누었다는 23.0로 표시됩니다)

알람이 꺼집니다 대화 활동 :

public class Notifier extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 


    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this); 

    alertDialogBuilder.setTitle("HydrateTime"); 
    alertDialogBuilder.setMessage("Enter the amount of water"); 
    alertDialogBuilder.setPositiveButton("Update", null); 

    AlertDialog alertDialog = alertDialogBuilder.create(); 
    alertDialog.show(); 

    } 
} 

알람이 울리면 위의 작업을 호출해야합니다. 위의 구현 된 논리가 활동이 진행될 때 대화 상자 창이 나타나게 할만큼 충분한가?

참고 : Android Manifest에서 일반적인 활동 정의를 사용하고 있습니다.

같은 : 아래의 질문에 대한

<activity 
     android:name=".Notifier" 
     android:label="@string/app_name"> 
</activity 

친절하게 요청 답변 :

  1. 내가 올바르게 다른 활동에 알람 관리기에 MainActivity에 설정된 시간 값을 전달하고 있는가?
  2. 내 알람 논리의 실수는 무엇이며 내 요구 사항에 따라 알람이 바뀌는 것을 수정하는 방법은 무엇입니까?
  3. 대화 상자의 정의가 정확합니까? 매니페스트에 정의가 더 있어야합니까? 대화 상자 활동을위한 레이아웃 파일을 만들어야합니까? Notifier 클래스를 Activity 클래스 대신 Dialog 클래스로 확장해야합니까?
+0

참고 : 전화가 '작동'기능을 사용하는 경우 알람 관리자가 정시에 실행되지 않을 수 있습니다. https://developer.android.com/training/monitoring-device-state/doze-standby.html – FrozenFire

+0

알람이 실행 중이지만 예상 시간과 간격이 아닙니다. –

+0

내 장치에서 Doze 기능을 사용할 수 없습니다. –

답변

0

논리에는 사소한 결함이 있습니다.이미 발사 시간이 지나면 경보가 울리고 즉시 경보가 울립니다. 예 : 1983 년 1 월 2 일에 milli 초 알람을 설정하면 즉시 작동합니다. 당신이 알아 차리면, 당신은 비슷한 것을하고 있습니다.

하기를 해결하려면 단순히 Alarm Activity이 추가 :

// Will trigger after 10 secs from set time 
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + AT_from + (10*1000), 10*1000, pendingIntent); 

그래도 난 간격 문제 원인을 모르겠습니다. 나에게 좋을 것 같다.

+0

아이디어를 제공해 주셔서 감사합니다. 대화 상자에서 사용하는 논리를 확인해 주시겠습니까? –

+0

@AkashDev 대화 상자에 대한 추가 선언이 필요하지 않습니다. – Shaishav

+0

시간 내 주셔서 감사 드리며 조언 해주십시오. –