2011-09-27 37 views
6

Tôi muốn đặt báo thức hàng tháng và hàng năm trong ứng dụng của mình. Tôi đã thực hiện việc này hàng tuần. AlarmManager.INTERVAL_DAY đã giúp tôi cho điều đó.Nhưng tôi không thể tìm thấy cách tốt để thực hiện lặp lại hàng tháng và hàng năm.Làm cách nào để thực hiện báo thức lặp lại hàng năm và hàng tháng?

được tìm kiếm cho đến nay:

http://www.satyakomatineni.com/akc/display?url=displaynoteimpurl&ownerUserId=satya&reportId=3503

http://groups.google.com/group/android-developers/browse_thread/thread/9f946e40307073c4?pli=1

Là bất kỳ cách nào khác có sẵn để làm điều này? Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

3

Tôi đã giải quyết được vấn đề. Trong ứng dụng của tôi, báo động đa kênh được thiết lập với các khoảng thời gian lặp lại khác nhau. Trong bộ thu phát của tôi để báo thức, tôi đã lên lịch lại báo thức dựa trên thời gian được lặp lại. Tôi đã sử dụng đối tượng lịch để thêm tháng và năm phù hợp và một lần nữa thiết lập nó cho alarm.i tiếp theo được sử dụng mã như thế này (để lập kế hoạch cho tháng tiếp theo) -

PendingIntent sender = PendingIntent.getBroadcast(context,Integer.parseInt(Long.toString(id)), intent1, 0);        

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(calendar.getTimeInMillis()); 
calendar.add(Calendar.SECOND, 30); 

AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

calendar.add(Calendar.MONTH, 1); 

am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender); 
+0

Tôi đã downvoted câu trả lời được chấp nhận này, bởi vì câu trả lời từ Laurent thực sự là câu trả lời đúng. –

17

Tôi nghĩ rằng, bạn có hai vấn đề cố hữu với cách tiếp cận này:

  • AlarmManager sẽ không chấp nhận những khoảng thời gian lớn vì số lượng millis sẽ tràn lập luận

  • Tôi không nghĩ rằng Báo động sẽ tồn tại khi khởi động lại điện thoại của bạn, điều chắc chắn nhất sẽ xảy ra trong một khoảng thời gian dài như vậy.

tôi lời khuyên mà bạn lưu trữ mỗi báo động ở một nơi an toàn và sử dụng một sự kết hợp của AlarmManager và onBoot thu để kiểm tra xem một trong những báo động ra khỏi danh sách của bạn phải bị sa thải ngày này rất và chỉ cần sắp xếp lại một báo động để đánh thức bạn lên vào ngày mai nếu không có.

public class AlarmService extends Service { 
    //compat to support older devices 
    @Override 
    public void onStart(Intent intent, int startId) { 
     onStartCommand(intent, 0, startId); 
    } 


    @Override 
    public int onStartCommand (Intent intent, int flags, int startId){ 
    //your method to check if an alarm must be fired today 
    checkForTodayAlarmsAndBehaveAppropriately(); 

    //reschedule me to check again tomorrow 
    Intent serviceIntent = new Intent(AlarmService.this,AlarmService.class); 
    PendingIntent restartServiceIntent = PendingIntent.getService(AlarmService.this, 0, serviceIntent,0); 
    AlarmManager alarms = (AlarmManager)getSystemService(ALARM_SERVICE); 
    // cancel previous alarm 
    alarms.cancel(restartServiceIntent); 
    // schedule alarm for today + 1 day 
    Calendar calendar = Calendar.getInstance(); 
    calendar.add(Calendar.DATE, 1); 

    // schedule the alarm 
    alarms.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), restartServiceIntent); 
    } 

} 

Để bắt đầu dịch vụ tại sử dụng thời gian khởi động này:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class serviceAutoLauncher extends BroadcastReceiver{ 

@Override 
    public void onReceive(Context context, Intent intent) { 
     Intent serviceIntent = new Intent(context,AlarmService.class); 
     context.startService(serviceIntent); 
    } 

} 

Cuối cùng thêm video này vào biểu hiện của bạn để sắp xếp serviceAutoLauncher của bạn sẽ được tung ra tại mỗi khởi động:

<receiver android:name="serviceAutoLauncher"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"></action> 
      <category android:name="android.intent.category.HOME"></category> 
     </intent-filter> 
    </receiver> 
+0

Cảm ơn phản ứng nhanh.Trong dự án của tôi, tôi đang sử dụng bộ thu phát để thu âm báo động. Tôi không biết làm thế nào tôi có thể tìm ra ý định của báo động được bắt trong onReceive của người nhận phát sóng của tôi. Sau đó làm thế nào tôi có thể lên lịch lại nó? bạn có thể vui lòng cung cấp một số mã mẫu? – Hiral

+0

@Hiral: xem chỉnh sửa của tôi. –

+0

Mã này có vẻ không hoạt động. Nó tiếp tục nói với tôi thêm một câu lệnh return cho public int onStartCommand. Bất kỳ ý tưởng? –

3

Để thêm với câu trả lời của Laurent. Để trừu tượng hóa tính toán lặp lại theo cách thủ công, tôi khuyên bạn nên xem this RFC-2445 implementation. Nó hoạt động tốt trên Android và có thể giúp bạn tiết kiệm rất nhiều đau đớn.

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