0

SCENARIO :

사용자가 글고로 45 (분)을 입력하고 "OK"버튼을 누르면 ..

후 45 분 보유 통과, 나는 코드의 블록을 실행하고 싶다.

나는 이것을하기 위해 2 가지 다른 방법들 사이에서 토론 해왔다. - 무엇이 가장 좋은가 & 왜?


옵션 # 1 - 알람 관리기 -> PendingIntent -> 텐트 -> BroadcastListener
어떤 구현이 가장 좋습니까? 시간에 사용자가 설정 한 시간 후 코드를 발생하는 2 가지

int timeValue = Integer.parseInt(editText_timer_value.getText().toString()); 

    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 

    Intent intent = new Intent(this, TimerReceiver.class); 

    PendingIntent pendingIntent = PendingIntent 
      .getBroadcast(this.getApplicationContext(), 234324243, intent, 0); 

    alarmManager.set(AlarmManager.RTC_WAKEUP, 
      System.currentTimeMillis() + (timeValue * 60000), pendingIntent); 

    finish(); 

    // TimerReceiver.class fires when the time is up, and contains additional Code. 


(OR)

OPTION # 2 - 텐트 -> 의도 기타 -> 서비스 -> CountDownTimer

String timeValue = editText_timer_value.getText().toString(); 

    Intent intent = new Intent(this, TimerService.class); 

    intent.putExtra("TIMER_VALUE", timeValue); 

    getApplicationContext().startService(intent); 

    finish(); 

    // TimerService.class starts immediately and runs a CountDownTimer from intent Extras 



"더 나은"또는 "올바른"입니다 구현 SO, 및 왜?
감사합니다. :)

추신 : 다른 제안도 매우 환영합니다!

답변

1

경보 관리자 : 이 클래스는 시스템 경보 서비스에 대한 액세스를 제공합니다. 이것들을 사용하여 미래의 어느 시점에서 응용 프로그램이 실행되도록 예약 할 수 있습니다. 알람이 울리면 등록 된 인 텐트가 시스템에 의해 브로드 캐스트되고 대상 응용 프로그램이 이미 실행되고 있지 않으면 자동으로 시작됩니다. 등록 된 알람은 장치가 잠 들어있을 때까지 유지되며 (해당 시간 동안 장치가 꺼지면 장치를 깨울 수 있음), 장치를 끄고 다시 부팅하면 장치가 지워집니다.

경보 수신자의 onReceive() 메소드가 실행중인 동안에는 경보 관리자가 CPU 대기 잠금을 유지합니다. 이렇게하면 브로드 캐스트 처리가 끝날 때까지 전화기가 잠자기 상태가되지 않습니다.

참고 : 알람 관리자는 응용 프로그램이 현재 실행 중이 아닌 경우에도 특정 시간에 응용 프로그램 코드를 실행하려는 경우에 사용됩니다. 통상의 타이밍 조작 (틱, 타임 아웃 등)에서는, Handler를 사용하는 것이 쉬우면서 훨씬 효율적입니다.

https://developer.android.com/reference/android/app/AlarmManager.html

서비스에 대해 배울 수 : 서비스는 단순히 사용자가 응용 프로그램과 상호 작용하지 않는 경우에도 백그라운드에서 실행 할 수있는 구성 요소입니다. 따라서 필요한 경우에만 서비스를 만들어야합니다.

메인 스레드 외부에서 작업을 수행해야하지만 사용자가 응용 프로그램과 상호 작용하는 동안에 만 작업을 수행해야하는 경우 서비스가 아닌 새 스레드를 만들어야합니다.예를 들어, 음악을 재생하면서 활동이 실행되는 동안에 만 onCreate()에서 스레드를 만들고 onStart()에서 실행 한 다음 onStop()에서 중지 할 수 있습니다. 전통적인 Thread 클래스 대신 AsyncTask 또는 HandlerThread를 사용하는 것도 고려하십시오. 스레드에 대한 자세한 내용은 프로세스 및 스레딩 문서를 참조하십시오.

는, 안드로이드는 말한다, 당신이 정말로 장기 실행, 무거운 작업을 수행하는 서비스를 사용해야하는 문서에 따라 https://developer.android.com/guide/components/services.html

에서 서비스에 대해 배웁니다. 당신이 일정 기간 동안 타이머를 사용하기를 원한다면 그 서비스를 사용하는 것은 완전히 말도 안되고 낭비입니다.

그래서 안드로이드가 설명서에서 말한 것처럼 AlaramManager를 사용하는 것이 좋습니다.

+0

내 질문에 대한 통찰력을 가져 주셔서 감사합니다 .. 내 Alarm Manager 구현이 정확한 것 같습니까? 다시 말하지만, 다음을주지하십시오 : 사용자는 타이머가 백그라운드에서 실행되는 동안 알람이 설정되는 시간 (사용자가 선택하는 분 수)을 입력 한 다음 활동 창이 닫힙니다. 그래서 타이머가 어떻게 든 중단되지 않도록하고 싶습니다. 전화가 재부팅되면 괜찮아요.하지만 그 외에는 타이머가 어떻게 든 죽지 않았는지 확인하고 싶습니다. 그렇다면 옵션 # 1이 최선의 선택이라고 생각하십니까? – StudioB

+0

문서를 살펴보면 AlarmManager를 사용하여 일정 시간이 경과 한 후에 일부 작업을 수행해야 할 때 수행 할 것을 제안하는 내용과 ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC, RTC_WAKEUP. 그래서 여기서 네 가지 유형이 다르게 행동하기 때문에 매우 조심해야합니다. 그래서 약간의 실험을하고 문서에서 그것들에 대해 배우면 당신의 필요에 가장 잘 맞는 것을 알 수 있습니다. https://developer.android.com/training/scheduling/alarms.html – xFighter

+0

두 가지 최종 질문 .. 알람 관리자'.set'의 확장이 ('alarmManager.set'에서와 같이) 위의 예에서 코드에서 넘어 섰습니까? 그것은 감가 상각 될지도 모른다. 그것은 그 경우 다 ?? 이것은 문제를 일으킬 수 있습니다. 그리고 마지막으로, 그것은 ive가 다른 모든 것을 올바르게 구현 한 것처럼 보입니까? 예를 들어 사용자 입력의 정수 'i'에 60,000을 곱해서 ms를 분으로 만들면 문제가 발생할 수 있습니다. 'int'가 아닌 'long'이어야합니까? 또는 내 예제처럼 'int'를 사용하여 여전히 작동합니까? 이 두 가지 문제가 모두 괜찮은지 확인하고 싶습니다. ..... – StudioB