5

こんにちは、特定の時間間隔で3分間アラームマネージャを使用しており、監視を開始しました。それはときどき働いて、突然、不規則な時間間隔があることに気付きました。添付のログには、「20-Jul-2016 12:22:03 pm」が表示されます。時間はさまざまです!私は電話を接続し、画面をオフにして監視しています! 3分ごとにサーバーにヒットし、レスポンスを1にします。しかし、一度にサーバーにヒットするには5分かかります!なぜこの奇妙な問題が起こったのですか?特定の時間間隔でアラームマネージャが機能しない

ここはコードです。

public void startAt3() { 
    Intent alarmIntent = new Intent(ActivityTracking.this, AlarmReceiver.class); 
    pendingIntent = PendingIntent.getBroadcast(ActivityTracking.this, 0, alarmIntent, 0); 
    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 
         /* Set the alarm */ 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    /* Repeating on every 3 minute interval */ 
    manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, 
      calendar.getTimeInMillis(), 
      180000L, pendingIntent); 
    String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime()); 
    Log.e("alarm",mydate); 

} 

AlarmReceiver:

public class AlarmReceiver extends WakefulBroadcastReceiver {//AlarmReceiver class 
@Override 
public void onReceive(Context context, Intent intent) {//onReceive method 
    String mydate = java.text.DateFormat.getDateTimeInstance().format(Calendar.getInstance().getTime()); 
    Log.e("alarm",mydate); 
    Intent service = new Intent(context, SimpleWakefulService.class);//intent to call another class 
    // Start the service, keeping the device awake while it is launching. 
    startWakefulService(context, service);//service started 
} 

SimpleWakefulService:

public class SimpleWakefulService extends IntentService { 
     public SimpleWakefulService() { 
     super("SimpleWakefulService");//instantiates simpleWakefulService 

    } 
    @Override 
    protected void onHandleIntent(Intent intent) { 
     Log.e("simpleWakeful","simpleWakeful"); 
     serviceCall(this); //here is downloadTaskMethod called and getting response as 1. 
    } 

enter image description here

答えて

5

setInexactRepeatingを使用しないでください。これは、名前が示すように、正確な時刻にアラームがオフになるようにスケジュールしません。あなたは、アラームからのコールを受信すると、別の3分でオフに行くために別のアラームをスケジュールし、

public void scheduleSingleAlarm(Context context) { 
    Intent intent = new Intent(context, NotificationReceiver.class); 
    PendingIntent pendingUpdateIntent = PendingIntent.getBroadcast(context, 
      SINGLE_ALARM_ID, intent, PendingIntent.FLAG_CANCEL_CURRENT); 

    Calendar futureDate = Calendar.getInstance(); 
    futureDate.add(Calendar.MINUTE, 3); 

    setSingleExactAlarm(futureDate.getTime().getTime(), pendingUpdateIntent); 
} 

@SuppressLint("NewApi") 
private void setSingleExactAlarm(long time, PendingIntent pIntent) { 
    if (android.os.Build.VERSION.SDK_INT >= 19) { 
     mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pIntent); 
    } else { 
     mAlarmManager.set(AlarmManager.RTC_WAKEUP, time, pIntent); 
    } 
} 

あなたはこのようなものを使用することができます。私はこれについてブログしましたhere

+0

あなたの返信ありがとうございます。私はブログから疑問を持っています。 onReceiveメソッドで、WrappedAlarmManagerとは何ですか?私のコードで何を使用する必要がありますか? – Shadow

+0

また、あなたは正しいと言いました。私は何をすべきか? – Shadow

+0

コードは私のGithubアカウントで入手できます:https://github.com/hoombar/android-training/tree/master/src/net/rdyonline/android_training/alarms –

0

あなたがAndroidのバージョン19(キットカット)から始まることAlarmManagerのための公式ドキュメントから参照することができ、アラーム正確にマークされていても、スケジュールされたあなたは既にinexactRepeating()を持っていますが)。

アラームは、デバイスの起床とバッテリの使用を最小限に抑えるために、システムイベントで束ねられます。これは設計によるものです。

関連する問題