9

Tôi sử dụng BroadcastReceiver với hành động TIMEZONE_CHANGED để đặt lại báo thức bằng AlarmManager để đảm bảo rằng báo thức chạy chính xác vào thời gian đã đặt, không sớm hơn vài giờ, tùy thuộc vào múi giờ thay đổi .TIMEZONE_CHANGED ý định được nhận vài giây

Tuy nhiên, trong nhật ký mới nhất do người dùng gửi, tôi đã thấy thông tin về mục đích với mỗi hành động TIMEZONE_CHANGED được nhận mỗi vài giây với người dùng phàn nàn về ứng dụng đang bị trục trặc.

Đây là mã onReceive BroadcastReceiver tôi

@Override 
public void onReceive(Context context, Intent intent) { 
    Utils.log("OnTimeChange"); 
    String action = intent.getAction(); 

    if (action.equals(Intent.ACTION_TIME_CHANGED)) { 
     Utils.log("TimeChange"); 
    } else if (action.equals(Intent.ACTION_TIMEZONE_CHANGED)) { 
     Utils.log("TimeZoneChanged"); 
    } 
    BroadcastsManager.updateBroadcastsFromAlarms(context, 
      AlarmsDbAdapter.getInstance(context)); 
} 

lọc ý định của manifest:

<intent-filter> 
    <action android:name="android.intent.action.TIMEZONE_CHANGED" /> 
    <action android:name="android.intent.action.TIME_SET" /> 
</intent-filter> 

Và một phần của log (nó đi như thế trong hơn một giờ - chiều dài đầy đủ của log)

1. 19/4 7:41:54 - posting alarm 3 for 8:15 (in 0h) 
2. 19/4 7:44:29 - OnTimeChange 
3. 19/4 7:44:29 - TimeZoneChanged 
4. 19/4 7:44:29 - posting alarm 3 for 8:15 (in 0h) 
5. 19/4 7:44:54 - OnTimeChange 
6. 19/4 7:44:54 - TimeChange 
7. 19/4 7:44:54 - posting alarm 3 for 8:15 (in 0h) 

Đó là Samsung Galaxy S III (Android v 4.1.2). Điều kỳ lạ là, điều đó không xảy ra trên S III của tôi. Có thể nào người dùng đã bật tùy chọn "thay đổi múi giờ tự động theo nhà cung cấp" trên thiết bị của anh ấy và thông tin như vậy được gửi cứ sau vài giây?

Có ai expierienced nó? Tôi đoán tôi sẽ chỉ cần thêm một tùy chọn để kiểm tra xem múi giờ đã thực sự thay đổi trước khi cập nhật chương trình phát sóng, nhưng nó vẫn là nhận được người nhận gọi mỗi vài giây ...

+0

Bạn đã thử bật thay đổi thời gian tự động trên SIII của mình và xem liệu điều tương tự có xảy ra không? – romo

+0

@romo Có - Tôi đã không viết nó trong câu hỏi, nhưng tôi đã kiểm tra nó trên S III của tôi cả với tùy chọn này được kích hoạt và vô hiệu hóa. – Koger

+0

Đây là một câu hỏi cũ, nhưng chỉ để thêm một cái gì đó: Tôi nhận thấy điều này quá và có vẻ như với tôi nó xảy ra khi người dùng có thời gian tự động thay đổi trên + kết nối thấp. Tôi đoán khi liên tục chuyển đổi từ wi-fi, mạng và không có thời gian được thiết lập lại mỗi khi bạn nhận được một kết nối.Như bạn đã viết trong câu trả lời - sự chậm trễ chính đến từ việc tái tạo các đối tượng định dạng ngày tháng và các loại tương tự, vì vậy giải pháp hiển nhiên sẽ là so sánh các khu vực trước khi thực hiện bất kỳ điều gì. – vladimir123

Trả lời

7

tôi vẫn không biết lý do tại sao sự thay đổi múi giờ và thiết lập thời gian được gọi rất thường xuyên, nhưng tôi đã có thể tìm ra giải pháp cho phép tôi tìm ra phản ứng thực sự cần thiết.

Tôi cũng chỉ nghe những thay đổi về múi giờ ngay bây giờ.

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 

String oldTimezone = prefs.getString(PREF_TIMEZONE, null); 
String newTimezone = TimeZone.getDefault().getID(); 

long now = System.currentTimeMillis(); 

if (oldTimezone == null || TimeZone.getTimeZone(oldTimezone).getOffset(now) != TimeZone.getTimeZone(newTimezone).getOffset(now)) { 
    prefs.edit().putString(PREF_TIMEZONE, newTimezone).commit(); 
    Logger.log("TimeZone time change"); 
    //update alarms 
} 

tôi thêm thời gian kiểm tra khu vực, bởi vì rất lâu tôi phát hiện ra, rằng khu mặc dù điều thay đổi, họ không khác nhau về thời gian trong bất kỳ cách nào. Ngoài ra một số người dùng tuyên bố rằng họ thậm chí không đi du lịch ở bất cứ đâu xa khi nhiều thay đổi trong khu vực đã được phát hiện - chỉ các chuyến đi thường xuyên để làm việc và quay trở lại.

Kiểm tra số lượng giới hạn các thao tác không cần thiết.

+0

Công việc tốt, tôi đã đến một giải pháp tương tự, nhưng vẫn tồn tại bù đắp thay vì ID. Tôi đã làm một cái gì đó tương tự cho bản cập nhật thời gian mà tôi bỏ qua cập nhật khi cài đặt "thời gian tự động" được bật, giả sử rằng múi giờ và thay đổi thời gian liên quan đến DST sẽ đi kèm với thay đổi múi giờ, chỉ để lại những điều chỉnh nhỏ. Khi "thời gian tự động" bị tắt, tôi phản hồi mọi thay đổi thời gian vì chúng có thể khá hiếm và quan trọng khi chúng xảy ra. –

+0

Câu trả lời này có vẻ đúng ... Tuy nhiên, không phải là điều kiện sai? Khi bạn so sánh hai offset, nó không được bằng nhau "! ="? –

+0

@FerranNegre bạn nói đúng. Tôi đã có nó như thế trong gần một năm và chỉ có hai người dùng phàn nàn. Và thậm chí sau đó tôi đã không nhận thấy điều này ... Thx đã sửa tôi – Koger

0

Tránh nghe cho:

<action android:name="android.intent.action.TIME_SET" /> 
<action android:name="android.intent.action.TIMEZONE_CHANGED" /> 

có vẻ như chúng được gọi thường xuyên khi thời gian chưa được thiết lập cũng như múi giờ thay đổi. Tôi nghi ngờ nó được liên kết với người dùng sử dụng "sử dụng mạng được cung cấp múi giờ và thời gian" trong cài đặt của điện thoại.

Nếu bạn thực sự làm cần phải lắng nghe cho các chương trình phát sóng, bạn nên kiểm tra xem thời gian thực sự đã thay đổi đáng kể hoặc nếu nó chỉ là một sự điều chỉnh phần nghìn giây từ mạng cung cấp thời gian

+0

Để xác định xem thời gian "thực sự đã thay đổi" tôi vẫn duy trì giá trị cài đặt "thời gian tự động" và chỉ phản hồi cho các sự kiện thay đổi thời gian khi "thời gian tự động" bị tắt (cũng như thay đổi giá trị cài đặt được duy trì). Giải pháp @ Koger là IMHO tốt cho việc theo dõi thay đổi múi giờ (chỉ đáp ứng với những thay đổi về bù giờ GMT). –

Các vấn đề liên quan