2016-09-18 5 views
0

私は別の期間にSMSメッセージを送信するために私のアプリケーションのためのAlarmManagerを作成しています。たとえばAlarmManagerの時間を5分にすると、すぐに約1〜2回起きますが、その後は正常に動作します。私は期間の値を変更した後、状況が繰り返されます。私は、これがAlarmManagerを停止すること、またはリピータを設定することで間違っていると思います。Androidのアラームマネージャが間違っている

これは私のmakeAlarm機能である:私は私のアラームを作成

public class SmsAlarmReceiver extends BroadcastReceiver { 
public static final int REQUEST_CODE = 322; 


    @Override 
    public void onReceive(Context context, Intent intent) { 

     Intent i = new Intent(context, SmsSenderService.class); 
     context.startService(i); 
    } 
} 

:これはBroadcastReceiverを拡張私のSmsAlarmReceiverクラスは

private void cancelAlarm() { 
    try { 
     Intent i = new Intent(this, SmsAlarmReceiver.class); 
     PendingIntent pIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE, 
       i, 0); 

     AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE); 

     alarm.cancel(pIntent); 
     pIntent.cancel(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

です:これは私のcancelAlarm機能が

private void makeAlarm() { 
    cancelAlarm(); 

    Intent i = new Intent(this, SmsAlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE, 
      i, PendingIntent.FLAG_UPDATE_CURRENT); 

    long firstMillis = System.currentTimeMillis(); 

    SharedPreferences refreshSettings = getSharedPreferences("com.example.xd720p.sensorcontroller_09082016", 
      Context.MODE_PRIVATE); 

    double refreshForTValue = Double.valueOf(refreshSettings.getString("tempPeriod", "30")); 

    if (refreshForTValue <= 0) { 
     cancelAlarm(); 
    } else { 
     long period = Math.round(refreshForTValue * 60 * 1000); 
     AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE); 
     alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis, 
       firstMillis + period, pendingIntent); 
    } 
} 

ですのメソッド。また、私は時の価値を変えて、私の警報を止め、新しいものを作ります。この値はSharedPreferencesに格納されていますので、onSharedPreferenceChangedにアラームを再現しようとしましたが、私の状況では意味をなさない。

+0

確認してくださいそのことはできません** refreshForTValue **これが問題になることvalue.Mayその – Saveen

+0

@Saveenこの値は、ユーザーが繰り返しのために0以下の値を入れるかどうかをチェックするためです。この場合、私はAlarmManagerを殺すだけです。私は問題が** refreshForTValueにあるとは思わない** – xd720p

+0

アラームの設定はこの値に依存します。あなたが思うようにそれが間違っているか違うならば。それはあなたに別の状況を与えるでしょう – Saveen

答えて

0

最後に、私はそれを解決しました!ここに私の解決策はmakeAlarm()機能である:

private void makeAlarm() { 
    cancelAlarm(); 

    Intent i = new Intent(this, SmsAlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), SmsAlarmReceiver.REQUEST_CODE, 
      i, PendingIntent.FLAG_CANCEL_CURRENT); 

    SharedPreferences refreshSettings = getSharedPreferences("com.example.xd720p.sensorcontroller_09082016", 
      Context.MODE_PRIVATE); 

    double refreshForTValue = 0; 


    refreshForTValue = Double.valueOf(refreshSettings.getString("tempPeriod", "30")); 


    if (refreshForTValue <= 0) { 
     cancelAlarm(); 
    } else { 
     long period = Math.round(refreshForTValue * 60 * 1000); 
     AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE); 
     long firstMillis = System.currentTimeMillis(); 
     alarm.setRepeating(AlarmManager.RTC_WAKEUP, firstMillis + period, 
       period, pendingIntent); 
    } 
} 
  1. あなたは私がsetRepeating()引数を変更見ることができるように。事は、期間の設定された開始時刻だけでなく、開始時刻にアラームを起動する第2引数です。すぐにアラームを解除したくない場合は、の期間をにする必要があります。 3番目の引数は単なる繰り返し時間なので、開始時刻を削除する必要があります。あなたはここの例ではこのことについて読むことができます:私たちはFLAG_UPDATE_CURRENTにFLAG_CANCEL_CURRENTからフラグを変更する必要がPendingIntent.getBroadcast()https://developer.android.com/training/scheduling/alarms.html

  2. 。なぜ私は正確に理由を説明することはできませんが、我々が設定するときにドキュメントによると更新フラグ変更されたプロパティのいくつかは無視されます。したがって、アラームは、まず、古い時に目を覚ますでしょう。しかし、CANCEL_FLAGは、プロパティを置き換えて、アラームを新しい期間に復帰させます。私の説明が間違っていれば申し訳ありません。私が言ったように、私はこの瞬間を完全に理解していませんでした。もし誰かが良い説明をしたら、私はうれしいでしょう。

関連する問題