2016-03-27 16 views
0

Bir hizmet cadı bazı zaman hesaplama dayalı bir uyarı tetikler bir android uygulaması var.Android'de Günışığı Tasarrufu Zaman geçişi nasıl algılanır

sorun olduğunda zaman dilimi değişiklikleri (Fransa bulunur ve UTC + 2 için UTC + 1 gider oluyor bir kullanıcı için yani .:). Uygulama bu değişiklik hakkında bilgilendirilmiyor ve bu nedenle uyarıyı bir gecikmeyle tetikliyor.

Zaten TimeZone API android kontrol ve benzeri yardımcı olabilecek bazı yöntemler olduğunu biliyorum:

Hesaplama algoritmamda dikkate almak için değişiklik ne zaman olacağını bilmek MUHTEMEL OLDUĞUNUZU10?

BTW: Zaten bloglar ve Stackoverflow gelen Q/A bir sürü kontrol ama yardımcı olmazsa :(

DÜZENLEME (bildirim dosyası ve alıcı sınıfı):

<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> 

Alıcı sınıfı: İşte benim tezahür

Sonra

1- Ben olduğu gibi Android Manifest tuttu (soruya bakın)

2- i alıcıyı biraz değişti:

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

Olası kopyalar [Tarih ve Android'de saat değişikliği dinleyici?] (http://stackoverflow.com/questions/5481386/date-and-time-change- yorumda post it dinleyici-in-android) –

+0

Nope, ben zaten BroadcastReceiver kullanmaya çalıştım ama yardımcı olmadı çünkü bu bir kopya değil. Saat diliminin ne zaman değişeceğini bilmek istiyorum ** –

+0

olacak. Sorunuzda bunu söylemediniz. Neden zaman değiştiğinde uyarınızı güncellemek için BroadcastReceiver kullanamazsınız? –

cevap

3

İşte ben bu sorunu çözene nasıl

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 
     } 
    } 
} 
01: burada
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- yeni zaman dilimi ve DST kullanımını hesaplar yöntemidir

İşte bu kadar. Dolayısıyla çözüm, bütün ApI'ları (söz konusu listede) birlikte birleştirmek oldu.

Bu çözümün diğerlerine yardımcı olacağını umuyorum. Herhangi bir sorunuz varsa sadece

ait