논리가 예상대로 작동하지 않기 때문에 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
친절하게 요청 답변 :
- 내가 올바르게 다른 활동에 알람 관리기에 MainActivity에 설정된 시간 값을 전달하고 있는가?
- 내 알람 논리의 실수는 무엇이며 내 요구 사항에 따라 알람이 바뀌는 것을 수정하는 방법은 무엇입니까?
- 대화 상자의 정의가 정확합니까? 매니페스트에 정의가 더 있어야합니까? 대화 상자 활동을위한 레이아웃 파일을 만들어야합니까? Notifier 클래스를 Activity 클래스 대신 Dialog 클래스로 확장해야합니까?
참고 : 전화가 '작동'기능을 사용하는 경우 알람 관리자가 정시에 실행되지 않을 수 있습니다. https://developer.android.com/training/monitoring-device-state/doze-standby.html – FrozenFire
알람이 실행 중이지만 예상 시간과 간격이 아닙니다. –
내 장치에서 Doze 기능을 사용할 수 없습니다. –