2017-12-05 3 views
1

현재 특정 시간에 코드 조각을 실행하려고합니다. 몇 가지 연구가 끝나면 올바른 방법은 AlarmManger을 사용하는 것입니다. 코드는 매일 오전 3시에 실행되어야합니다. 전화가 오전 3시에 종료되면 전화를 켜고 코드를 바로 실행해야합니다.특정 시간에 매일 코드 실행 - AlarmManager

Google 검색 결과를 사용하여 많은 결과를 발견했습니다. 하지만 내 코드가 제대로 작동하지 않습니다.

어제 알림이 도착했습니다. 알림 시간은 오후 10시였습니다. 그러나 코드에서 시간은 오전 3 시로 설정됩니다. 나는 (테스트 때문에) 많은 시간 동안 알람 매니저를 설치했다. 트리거 된 AlarmManager가 오래된 것일 수도 있습니다. 참고 : 새 AlarmManager를 설정하기 전에 휴대 전화에서 전체 애플리케이션을 삭제하고 새로 설치했습니다. (나는이 모든 설정 알람 관리기의 삭제됩니다 생각?)

이 좋아, 내가 사용하고있는 코드입니다 :

Calendar calendar = Calendar.getInstance(); 
 
calendar.setTimeInMillis(System.currentTimeMillis()); 
 
calendar.add(Calendar.SECOND, 0); 
 
calendar.add(Calendar.MINUTE, 0); 
 
calendar.add(Calendar.HOUR, 3); 
 

 
Intent _myIntent = new Intent(MainActivity.this, AlarmReceiver.class); 
 
_myIntent.putExtra("MyMessage","Content of the message"); 
 
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 123, _myIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
 

 
AlarmManager alarmManager = (AlarmManager) MainActivity.this.getSystemService(Context.ALARM_SERVICE); 
 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 1000*60*60*24, pendingIntent);

이 코드는 (내 응용 프로그램의 모든 시작에 실행됩니다 내부 MainActivity'sonCreate(); 방법).

+0

대신 alaram manager를 사용하면 날짜와 시간이 현재 날짜와 다른 경우 sharepreference에 날짜와 시간을 저장해 보았습니다. ur 코드를 실행하고 이전 날짜 대신 새 날짜와 시간을 저장할 수 있습니다. –

+0

@LokeshDesai 하지만 어떻게 기본 'AlarmManager' 작업을 할 수 있습니까? 현재 오후 3시에 발사하지 않습니다. 그리고 아이디어를 실현하기 위해서는 특정 시간에 시작해야합니다. 즉, 공유 환경 설정에서 제공됩니다. – MyNewName

+0

예. 당신은 내 생각에 맞습니다. 특정 시간에 실행되지만 정확하게 실행됩니다. –

답변

1

참고 : API 19로, 모든 반복 알람이 부정확하다. 정확한 배송 시간이 필요한 애플리케이션의 경우 매번 일정을 변경하여 일회성 정확한 알람을 사용해야합니다.

정확하지 않은 스케줄링이란 알람을 연속적으로 두 번 울리는 사이의 시간이 다를 수 있음을 의미합니다. 네 사건에서 무슨 일이 일어난 것 같아. 정확한 시간 문제를 극복하기 위해서는 한 번만 사용 하는게 좋을 것 같아.하지만이 경우에는 다음날 다시 일정을 조정해야 해. 등등. 문서 setrepeating, setInexactRepeating에서 매우 명확한 이해를 얻을 수 있습니다.

+0

경보가 울려 야합니다. 몇 분이면 문제가 없지만 몇 시간이면 문제가됩니다. 그래서 나는 경보가 발사 될 때마다 새로운 경보를 생성 할 것이다. 첫 번째 알람은 첫 번째 애플리케이션 시작시 생성됩니다. ** 더 많은 질문 **. 해고 경보는 어떻게됩니까? 삭제 될까요? 해고 될 때 삭제해야합니까? – MyNewName

+0

한 번 발사되면 단발 경보가 자동으로 삭제됩니다 (1 회 수명). 가장 좋은 방법을 명확히하기 위해 문서를 읽어야합니다. 나는 내 의견을 말했다. – ADM

+0

좋아, 나는 발사되면 단발 경보를 재설정하는 것으로 해결했다. 너 덕분에 나를 많이 도왔다! – MyNewName

0

저는 이것이 Power Manager가 App Activity의 문제로 인해 발생했다고 생각합니다.

는 API 수준에서 추가 Power Manager

PARTIAL_WAKE_LOCK를 사용해보십시오 1 INT의 PARTIAL_WAKE_LOCK 웨이크 잠금 수준 : CPU가 실행되도록합니다; 화면 및 키보드 백라이트가 꺼질 수 있습니다.

사용자가 전원 버튼을 누르면 화면이 꺼지지만 CPU는 모든 부분 웨이크 업 잠금이 해제 될 때까지 계속 켜져 있습니다.

상수 값 : 1 (0x00000001)

여전히 나던 작품은, 일부 로그 또는 활동 :

예보다 코드 조각 게시 할 수있는 경우에, 그냥 가정입니다 :

//Initialize the Power Manager 
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 

//Create a PARTIAL_WAKE_LOCK 
//This will keep the cpu running in the Background, so that the function will be called on the desired Time 
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag"); 

//Check if the WackLock is held (may throw erro if you try to acquire twice) 
//TRUE --> Do nothing, all good 
//FALSE --> Acquire the WakeLock 
if(!wl.isHeld()){ 
    wl.acquire(); 
} 

//***** 
//You code for the repeating task goes Here 
//***** 

//If the Repeating task is not active, release the Lock 

//Check if the WackLock is held (may throw error if you try to release a none acquired Lock) 
//TRUE --> Release Lock 
//FALSE --> Do nothing, all good 
if(wl.isHeld()){ 
    wl.release(); 
} 
+0

내 주된 문제는 주어진 시간에'AlarmManager'가 작동하지 않는다는 것입니다. PowerManager가 어떻게 도움이 될지 모르겠습니다. 조금 더 구체적 일 수 있습니까? 물론 더 많은 코드를 보여줄 수는 있지만 필수는 아닙니다. 이것이 유일한 흥미로운 코드입니다. – MyNewName

1
Calendar calendar = Calendar.getInstance(); 

calendar.set(Calendar.HOUR_OF_DAY, 13); // For 1 PM or 2 PM 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 
PendingIntent pi = PendingIntent.getService(context, 0, 
      new Intent(context, MyClass.class),PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
           AlarmManager.INTERVAL_DAY, pi); 

AlarmReceiver은 방송 수신기이며, 이미 컨텍스트를 가지고, 그래서 당신은 직접 벨소리 m를 설정할 수 있습니다 활동을 시작하지 않고 방송 수신자에게 침묵하라.

@Override 
    public void onReceive(Context context, Intent intent) { 
     AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
     am.setRingerMode(AudioManager.RINGER_MODE_SILENT); 
} 

이 권한을 추가하시기 바랍니다 :

<uses-permission android:name="android.permission.WRITE_SETTINGS" ></uses-permission> 
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" ></uses-permission> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" ></uses-permission> 
<receiver android:name=".receivers.MyReceiver" /> 
관련 문제