2017-02-28 2 views
0

내 앱은 휴먼 활동 인식을 수행하고 사용자가 충분히 활동하지 않는 경우이를 사용자에게 알립니다. 항상 실행중인 전경 서비스에서 가속도계의 데이터를 읽습니다. 현재 사용자가 잠자기 상태 일 때 (예 : 사용자가 잠자기 시간 간격을 8pm - 8am으로 설정) 서비스를 시작하고 중지하려고 시도하므로 지정된 시간 후에 서비스를 중지하고 다시 시작해야합니다. 현재 다음 코드는 작동하지 않으며 이유가 확실하지 않습니다. 어떤 제안이라도?특정 시간에 서비스 시작 및 중지 일정 예약

참고 : 저는 코드가 어떻게 든 Calendar 인스턴스를 재사용하도록 만들 것입니다. 이는 디버깅 목적으로 사용하고 먼저 작동 시키도록합니다.

Date startSleepingHours = mUser.getStartSleepingHours(); 
    Date stopSleepingHours = mUser.getStopSleepingHours(); 
    //Create alarm manager 
    AlarmManager alarmMgr0 = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    Calendar cur_cal = new GregorianCalendar(); 
    cur_cal.setTimeInMillis(System.currentTimeMillis());//set the current time and date for this calendar 

    Calendar cal = new GregorianCalendar(); 
    cal.add(Calendar.DAY_OF_YEAR, cur_cal.get(Calendar.DAY_OF_YEAR)); 
    cal.set(Calendar.HOUR_OF_DAY, startSleepingHours.getHours()); 
    cal.set(Calendar.MINUTE, startSleepingHours.getMinutes()); 
    cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND)); 
    cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND)); 
    cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE)); 
    cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH)); 

    Intent startServiceIntent = new Intent(ActiveMinutesActivity.this, IntentBroadcastedReceiver.class); 
    Intent stopServiceIntent = new Intent(ActiveMinutesActivity.this, IntentBroadcastedReceiver.class); 
    stopServiceIntent.putExtra("command", "STOP_SERVICE"); 

    PendingIntent stopServicePIntent = PendingIntent.getService(ActiveMinutesActivity.this, 0, stopServiceIntent, 0); 

    PendingIntent startServicePIntent = PendingIntent.getService(ActiveMinutesActivity.this, 1, startServiceIntent, 0); 

    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 60 * 1000, stopServicePIntent); 


    Calendar cal2 = new GregorianCalendar(); 
    cal2.add(Calendar.DAY_OF_YEAR, cur_cal.get(Calendar.DAY_OF_YEAR)); 
    cal2.set(Calendar.HOUR_OF_DAY, stopSleepingHours.getHours()); 
    cal2.set(Calendar.MINUTE, stopSleepingHours.getMinutes()); 
    cal2.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND)); 
    cal2.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND)); 
    cal2.set(Calendar.DATE, cur_cal.get(Calendar.DATE)); 
    cal2.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH)); 


    alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), 60 * 1000, startServicePIntent); 

그리고 내 수신기 클래스 :

public class IntentBroadcastedReceiver extends BroadcastReceiver { 
public IntentBroadcastedReceiver() { 
} 

@Override 
public void onReceive(Context context, Intent intent) { 
    if(intent.getExtras() != null){ 
     if(intent.getExtras().get("command").equals("STOP_SERVICE")){ 
      context.stopService(new Intent(context, ActiveMinutesService.class)); 
     }else { 
      context.startService(new Intent(context, ActiveMinutesService.class)); 
     } 
    } 

} 
} 

답변

0

당신의 AndroidManifest.xml에서 수신기로 IntentBroadcastedReceiver을 정의 있나요? 즉 :

<receiver android:name=".IntentBroadcastedReceiver "></receiver> 
+0

나는이 코멘트를해야하는데 알고,하지만 난 너무 newebie 해요 :) –

+0

이 질문에 대한 답을 제공하지 않습니다. 충분한 [평판] (https://stackoverflow.com/help/whats-reputation)이 있으면 [모든 게시물에 주석 달기] (https://stackoverflow.com/help/privileges/comment) 할 수 있습니다. 대신, [질문자의 설명이 필요없는 답변을 제공하십시오] (https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can- i-do- 대신). - [검토 중] (리뷰/저품목/17660611) – alexi2

+0

의견을 보내 주셔서 감사합니다. 예, 매니페스트에 리시버를 정의했습니다. –