2012-08-25 23 views
7

Tôi muốn đạt được điều này:Thông báo hàng ngày tại thời điểm nhất định

Sau lần đầu tiên bật ứng dụng, người dùng nhận được thông báo, mỗi ngày lúc 2 giờ chiều, nếu điều kiện nhất định là đúng. Nếu điều kiện là sai, chúng tôi sẽ không hiển thị thông báo vào ngày này. Điều kiện được kiểm tra lúc 2 giờ chiều, nó tải xuống một số dữ liệu từ Internet.

Cho đến nay tôi đã sử dụng AlarmManager và phương thức setRepeating() với khoảng thời gian 24h. AlarmManager kích hoạt Service. Trong Dịch vụ này tôi đang tải xuống dữ liệu, kiểm tra điều kiện và nếu nó là đúng - hiển thị Notification. Vì việc tải xuống có thể kéo dài hơn 5 giây, tôi đã khai báo android:process=":background" cho Dịch vụ này, để chạy nó trong quy trình riêng biệt và không chặn giao diện người dùng của tôi.

Cách tiếp cận này có hai nhược điểm:


1: Nếu người dùng mở ứng dụng giả sử lúc 4 giờ chiều (và điều kiện là true), ông sẽ nhận được thông báo ngay lập tức . Từ setRepeating() tài liệu:

Nếu thời gian xảy ra trong quá khứ, báo động sẽ được kích hoạt ngay lập tức, với một số báo động tùy thuộc vào cách xa trong quá khứ thời gian kích hoạt là tương đối so với khoảng thời gian lặp lại.

Tôi muốn người dùng đó sẽ không nhận được thông báo vào ngày này, chỉ vào ngày tiếp theo v.v.


2: Tôi lo lắng rằng thông báo của tôi sẽ không hiển thị sau khi người dùng tắt điện thoại. Từ tài liệu AlarmManager:

Báo thức đã đăng ký được giữ lại trong khi thiết bị đang ngủ (và có thể tùy chọn đánh thức thiết bị nếu chúng tắt trong thời gian đó), nhưng sẽ bị xóa nếu thiết bị bị tắt và khởi động lại.

Tôi không biết liệu nó có thể làm cho nó hoạt động mọi lúc.


Nếu bạn có bất kỳ ý tưởng nào để cải thiện, bạn được chào đón.

Trả lời

6

1: Tôi không hoàn toàn chắc chắn nếu tôi hiểu câu hỏi của bạn, nhưng tôi nghĩ rằng tất cả các bạn phải làm là nếu nó đã được 14:00 qua thêm một ngày để 14:00:

GregorianCalendar twopm = new GregorianCalendar(); 
twopm.set(GregorianCalendar.HOUR_OF_DAY, 14); 
twopm.set(GregorianCalendar.MINUTE, 0); 
twopm.set(GregorianCalendar.SECOND, 0); 
twopm.set(GregorianCalendar.MILLISECOND, 0); 
if(twopm.before(new GregorianCalendar())){ 
    twopm.add(GregorianCalendar.DAY_OF_MONTH, 1); 
} 
alarmManager.setRepeating(type, twopm.getTimeInMillis(), 1000*60*60*24, intent); 

2: Bạn có thể đăng ký BroadcastReceiver để khởi động và khởi động lại báo thức của bạn ở đó. Hãy xem điều này: Android BroadcastReceiver on startup - keep running when Activity is in Background

+0

đây là một gợi ý hay, tôi cũng sử dụng số này – slinden77

+0

Cảm ơn bạn rất nhiều! Tôi có một câu hỏi, bạn có chắc chắn rằng: twopm.set (GregorianCalendar.HOUR, 2) đang thiết lập giờ PM, không phải AM? Có lẽ tôi nên sử dụng haiPm.set (GregorianCalendar.HOUR_OF_DAY, 14)? –

+0

vâng, bạn nói đúng – AntonS

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