2016-03-27 5 views
0

Ich habe eine Android-App, die einen Dienst hat, der eine Warnung basierend auf einer gewissen Zeit feuert.So erkennen Sie die Umstellung auf die Sommerzeit in Android

Das Problem ist, wenn die Zeitzone Änderungen (d.h .: Für einen Benutzer, Frankreich gelegen ist und geht von UTC + 1 bis UTC + 2). Die Anwendung wird nicht über diese Änderung benachrichtigt und löst daher die Warnung mit einer Verzögerung aus.

Ich habe überprüft bereits android TimeZone API und wissen, dass es einige Methoden gibt, die helfen können, wie:

IST ES MÖGLICH zu wissen, wann die Änderung eintritt, um sie in meinem Berechnungsalgorithmus zu berücksichtigen?

BTW: Ich habe schon viel von Blogs und Q/A von Stackoverflow, aber nicht helfen :(

EDIT (Manifest-Datei und der Empfänger-Klasse):

hier ist mein Manifest:

<receiver android:name=".receiver.NotificationReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.BOOT_COMPLETED" /> 
     <action android:name="android.intent.action.TIMEZONE_CHANGED" /> 
     <!--action android:name="android.intent.action.TIME_SET" /--> 
    </intent-filter> 
</receiver> 

Empfängerklasse:

public class NotificationReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     WakeLock.acquire(context); 
     Intent service = new Intent(context, NotificationService.class); 
     service.putExtras(intent); 
     context.startService(service); 

     // Timezone or time change 
     if (intent.getAction() != null 
      && (intent.getAction().equals(Intent.ACTION_TIME_CHANGED) 
       || intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED))) 
     { 
      Intent i = new Intent(context, DialogPopUpTimeChange.class); 
      i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      context.startActivity(i); 
     } 
    } 
} 
+0

Mögliche Duplikat [Datum und Uhrzeit ändern Hörer in Android?] (Http://stackoverflow.com/questions/5481386/date-and-time-change- listener-in-android) –

+0

Nein, es ist kein Duplikat, weil ich bereits BroadcastReceiver verwendet habe, aber nicht geholfen hat. Ich möchte wissen, wann sich die Zeitzone ändert ** wird ** passieren –

+0

Das hast du in deiner Frage nicht gesagt. Warum können Sie einen BroadcastReceiver nicht verwenden, um Ihren Alarm zu aktualisieren, wenn sich die Zeit ändert? –

Antwort

3

Nun, hier ist, wie ich dieses Problem behoben:

1- ich das Android Manifest gehalten, wie er ist (siehe Frage)

2- Dann änderte ich den Hörer ein wenig:

public class NotificationReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     WakeLock.acquire(context); 
     // Timezone or time change 
     if (intent.getAction() != null 
      && (intent.getAction().equals(Intent.ACTION_TIME_CHANGED) 
      || intent.getAction().equals(Intent.ACTION_TIMEZONE_CHANGED))) 
     { 
      calculateTimeZone(context); 
     } 
    } 
} 

3- Dies ist die Methode, die die neue Zeitzone und die Verwendung von DST berechnet:

public void calculateTimeZone(Context context) { 
    float ONE_HOUR_MILLIS = 60 * 60 * 1000; 

    // Current timezone and date 
    TimeZone timeZone = TimeZone.getDefault(); 
    Date nowDate = new Date(); 
    float offsetFromUtc = timeZone.getOffset(nowDate.getTime())/ONE_HOUR_MILLIS; 

    // Daylight Saving time 
    if (timeZone.useDaylightTime()) { 
     // DST is used 
     // I'm saving this is preferences for later use 

     // save the offset value to use it later 
     float dstOffset = timeZone.getDSTSavings()/ONE_HOUR_MILLIS; 
     // DstOffsetValue = dstOffset 
     // I'm saving this is preferences for later use 

     // save that now we are in DST mode 
     if (timeZone.inDaylightTime(nowDate)) { 
      // Now you are in use of DST mode 
      // I'm saving this is preferences for later use 
     } else { 
      // DST mode is not used for this timezone 
      // I'm saving this is preferences for later use 
     } 
    } 
} 

Das war's. Die Lösung bestand also darin, alle in der Frage aufgeführten APIs zu kombinieren.

Ich hoffe, dass diese Lösung anderen helfen wird. Wenn Sie Fragen haben nur post it in Kommentar