1

Android 앱에 알림을 설정하려고합니다. 설정 시간이 지정된 특정 요일에 종료됩니다. 모든 것이 첫 번째 알람에는 문제없이 작동하지만 반복하지 않으며 다른 날에는 작동하지 않습니다. 다음Android에서 알림이 반복되지 않음

인터페이스입니다 : 당신이에서 볼 수 있듯이

private void scheduleAlarm(int dayOfWeek) { 
    Intent myIntent = new Intent(this , NotifyService.class); 
    PendingIntent pendingIntent = PendingIntent.getService(this, 0, myIntent, 0); 

    AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 

    if (dayOfWeek == 0) 
     alarmManager.cancel(pendingIntent); 
    else { 
     Calendar calendar = Calendar.getInstance(); 
     String time_str[] = reminder_time.getText().toString().split(":"); 
     calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); 
     calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time_str[0])); 
     calendar.set(Calendar.MINUTE, Integer.parseInt(time_str[1])); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 

     Long time = calendar.getTimeInMillis(); 
     Long weekly = AlarmManager.INTERVAL_HOUR/12; //AlarmManager.INTERVAL_DAY * 7; 

     alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, time, weekly, pendingIntent); 
    } 
} 

: "변경 사항 저장"에

enter image description here

을 클릭하면, 각 선택한 날짜에 대한 scheduleAlarm 방법 호출됩니다 버전 알림을 5 분마다 반복하려고했습니다 (Long weekly = AlarmManager.INTERVAL_HOUR/12;)

알림 서비스 cal 알람이 울릴 때 켜집니다 :

public class NotifyService extends Service { 
public NotifyService() { 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    //TODO do something useful 
    return Service.START_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO: Return the communication channel to the service. 
    throw new UnsupportedOperationException("Not yet implemented"); 
} 

@Override 
public void onCreate() { 
    Intent intent = new Intent(this , Splash.class); 
    intent.putExtra(getString(R.string.NOTIFICATION), true); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0); 

    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon_ensafe); 
    long[] pattern = {500,500,500,500,500,500,500,500,500}; 

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
      .setContentTitle(getString(R.string.reminder)) 
      .setContentText(getString(R.string.reminder_body)) 
      .setLargeIcon(bm) 
      .setSmallIcon(R.drawable.notification_icon_ensafe) 
      .setContentIntent(contentIntent) 
      .setAutoCancel(true) 
      .setVibrate(pattern) 
      .setStyle(new NotificationCompat.InboxStyle()) 
      .setSound(Settings.System.DEFAULT_NOTIFICATION_URI); 

    NotificationManager notificationManager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 
    notificationManager.notify(1, mBuilder.build()); 
} 
} 

왜 작동하지 않는가? @Frank으로

가 제안했다

편집, 내가 브로드 캐스트 리시버를 구현하지만, 호출 적이 없어요. 매니페스트에

:

<receiver android:name=".synchro.BootReceiver" 
     android:enabled="false"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
     </intent-filter> 
    </receiver> 

클래스 :

ComponentName receiver = new ComponentName(getApplicationContext(), BootReceiver.class); 
    PackageManager pm = getApplicationContext().getPackageManager(); 
pm.setComponentEnabledSetting(receiver, 
       PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
       PackageManager.DONT_KILL_APP); 

더 이상의 아이디어를 다음과 같이 방송사는 위에 나열된 scheduleAlarm 방법에 시작

public class BootReceiver extends BroadcastReceiver { 

List<Integer> selectedDays; 
SharedPreferences preferences; 

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 

     **\\ STUFF HAPPENS HERE \\ ** 

    } 
} 
} 

?

답변

2

장치가 꺼지면 모든 예약 된 경보가 OS에 의해 취소됩니다. 너 문제 야?

이 문제를 해결하려면, 당신은 방송 수신기와 장치 신생을 듣고 장치가 방송을 시작했을 때 온다 다시 알람을 예약해야합니다.

을 * EDIT *

모든 정보를 당신에게 필요는이 페이지에 : https://developer.android.com/training/scheduling/alarms.html 특히 "절 장치 부츠가되면 알람을 시작"에

". 장치가 종료 될 때 기본적으로 모든 알람이 취소 일이 발생을 방지하기 위해 ..."

설정 및 테스트하는 데 약간의 시간이 걸립니다. 빨리.

+0

답변 해 주셔서 감사합니다. 이 브로드 캐스트 리스너는 OS 후류에서 호출되는 NotifyService 클래스에 구현되어야합니다. – Oiproks

+0

확인. 기본적으로 BootReceiver에서 alarmManager를 통해 알람을 다시 스케줄해야하며 서비스는 알람 자체를 관리합니다. 내가 맞습니까? – Oiproks

+0

네, 맞습니다! – Frank

0

확인. 나는 그 문제를 해결했다.

NotifyService 클래스에서 나는 onCreate() 메서드를 사용하여 알람을 다시 예약했습니다. 이 메서드는 처음에만 호출됩니다. 그 후 onStartCommand 만 호출됩니다. 이 두 가지 방법을 관리하여 작동하는 AlarmAcheduler를 달성했습니다.