1

Androidアプリでリマインダーを設定しようとしていますが、これは同じ設定時間で特定の日に消えます。 最初のアラームはすべて正常に動作しますが、それ以降は繰り返されず、他の日は消えません。Androidのリマインダーは繰り返されません

インタフェースを以下に示します。

「変更の保存」をクリックすると、それはそれぞれの選択した日のscheduleAlarm法と呼ばれる

enter image description here

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); 
    } 
} 

あなたがこの中に見ることができるようにバージョン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()); 
} 
} 

なぜそれが動作していないのですか?

EDIT

@Frankは示唆したように、私はBroadcastReceiverを実装し、それが呼び出されることはありませんです。マニフェストに

<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が呼び出されます。 これら2つの方法を管理して、私は動作しているAlarmAchedulerを達成しました。

関連する問題