2011-01-19 33 views
11

Tôi đang tạo ứng dụng sẽ kích hoạt thông báo vào các khoảng thời gian cụ thể trong thời gian người dùng thức giấc.Sử dụng alarmManager và dịch vụ để thực hiện thông báo lịch biểu chỉ trong khoảng thời gian cụ thể

Tôi có một AlarmManager đang chạy bên trong một dịch vụ. Dịch vụ này được bắt đầu rõ ràng thông qua nút bấm vào hoạt động chính và có thông báo thực thi alarmManager trong các khoảng thời gian cụ thể. Làm cách nào để tôi dừng thông báo trong một số giờ nhất định trong ngày? Ví dụ: tôi không muốn các thông báo này được kích hoạt trong khi người dùng đang ngủ.

Mã của tôi hiện đang bắn thông báo trong khoảng thời gian do người dùng thiết lập dưới (nhập khẩu lấy ra .... đây là dài đủ đã được):

public class FartSmackinChunks extends Service { 
    public Notification scheduleNotification; 
    public AlarmManager alarmScheduleManager; 
    public PendingIntent alarmScheduleIntent; 
    private Boolean autoUpdateBoolean = true; 
    private int intervalsGoneByInt = 0; 
    private Notification notification; 
    public static final int NOTIFICATION_ID = 1; 

    @Override 
    public void onCreate() { 
     // TODO: Actions to perform when service is created. 
     int icon = R.drawable.icon; 
     String tickerText = "INTERVAL FIRED"; 
     long when = System.currentTimeMillis(); 
     scheduleNotification = new Notification(icon, tickerText, when); 

     alarmScheduleManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 

     String ALARM_ACTION; 
     ALARM_ACTION = ScheduleAlarmReceiver.ACTION_REFRESH_SCHEDULE_ALARM; 
     Intent intentToFire = new Intent(ALARM_ACTION); 
     alarmScheduleIntent = PendingIntent.getBroadcast(this, 0, intentToFire, 
     0); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     SharedPreferences mySharedPreferences = 
     PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     boolean autoUpdateBoolean = 
     mySharedPreferences.getBoolean("storedAutoUpdateBoolean", false); 
     String updateFreq = 
     mySharedPreferences.getString("storedInitialAverageTimeInterval", "00:00:00"); 

     SimpleDateFormat dfInterval = new SimpleDateFormat("hh:mm:ss"); 

     Date intervalTimeAsDateObject = null; 
     long updateFreqMilliLong; 
     try { 
      intervalTimeAsDateObject = dfInterval.parse(updateFreq); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     updateFreqMilliLong = intervalTimeAsDateObject.getTime() - 18000000; 

     if (autoUpdateBoolean) { 
      int alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP; 
      long timetoRefresh = SystemClock.elapsedRealtime() + 
      updateFreqMilliLong; 
      alarmScheduleManager.setInexactRepeating(alarmType, 
      timetoRefresh, updateFreqMilliLong, alarmScheduleIntent); 
      notifications(); 
     } else alarmScheduleManager.cancel(alarmScheduleIntent); 

     return Service.START_NOT_STICKY; 
    }; 

    private void notifications() { 
     **notification stuff in here*** 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Replace with service binding implementation. 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     this.alarmScheduleManager.cancel(alarmScheduleIntent); 
    } 
} 

..... và thực hiện phát sóng thu của tôi ở đây :

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

public class ScheduleAlarmReceiver extends BroadcastReceiver { 

    public static final String ACTION_REFRESH_SCHEDULE_ALARM 
    = "com.application.ACTION_REFRESH_SCHEDULE_ALARM"; 

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

Tôi đang gặp khó khăn trong việc gói gọn bộ não của mình về cách triển khai.

Tôi đã suy nghĩ để làm lại mã này để cảnh báo được kích hoạt lúc bấy giờ và dừng lại lúc sleepTime, tất cả trong khi bên trong dịch vụ là Bộ hẹn giờ kích hoạt phương thức thông báo tại các khoảng thời gian cụ thể? Có cách nào tốt hơn để thực hiện việc này không?

Bất kỳ đầu vào nào cũng sẽ được đánh giá cao. Tôi đã cố gắng để làm việc này trong đầu của tôi trong nhiều ngày nay.

Cảm ơn

EDIT: @anyone ai đi qua này có ý định sử dụng một Timer cho các thông báo hàng ngày:

Một giờ mà chạy bên trong của một dịch vụ sẽ được tạm dừng bởi thời gian chạy khi thiết bị được đặt vào chế độ ngủ (tức là ... người dùng đặt điện thoại ở chế độ chờ). Do đó, việc sử dụng Bộ hẹn giờ để kích hoạt thông báo vào các khoảng thời gian cụ thể sẽ không hoạt động chính xác trong một dịch vụ vì khi Android tạm dừng dịch vụ, nó cũng tạm dừng bộ hẹn giờ.

Cách chính xác để thực hiện việc này là sử dụng AlarmManager với một loạt các mục đích đang chờ xử lý để đặt báo thức vào những thời điểm cụ thể trong ngày. Điều này đảm bảo rằng ngay cả khi điện thoại được đặt ở chế độ chờ, các thông báo (hoặc bất kỳ điều gì bạn muốn xảy ra tại thời điểm đó) sẽ vẫn được thực thi.

+0

'mySharedPreferences.getBoolean' bị thiếu -' // TODO: Hành động thực hiện khi dịch vụ được tạo' cần thiết? (trong câu hỏi ít nhất - các TODO khác là Ok) Ngoài ra tại sao sử dụng một dịch vụ (chạy dài)? –

+1

@Mr_and_Mrs_D - Tôi đã kết thúc bằng cách sử dụng lớp AlarmManager với một loạt các ý định đang chờ xử lý để thực hiện việc này. – dell116

Trả lời

3

Tôi đã suy nghĩ để làm lại mã này sao cho alarmManager được kích hoạt tại thời điểm chờ và dừng ở chế độ sleepTime, tất cả trong khi bên trong dịch vụ là Bộ hẹn giờ kích hoạt phương thức thông báo tại các khoảng thời gian cụ thể? Có cách nào tốt hơn để thực hiện việc này không?

Để tâm trí của tôi, hãy quên suy nghĩ của một cách 'tốt hơn', có vẻ như là cách duy nhất. Sử dụng bộ đếm thời gian để điều khiển (bật/tắt) một bộ đếm thời gian khác không quá kỳ lạ và có ý nghĩa hoàn toàn đối với tôi.

+0

Cảm ơn bạn đã trả lời MisterSquonk. Tôi đã không làm việc với AlarmManager trước đây, vì vậy điều này là mới đối với tôi. Cảm ơn bạn đã tái đảm bảo chuyến tàu tư tưởng của mình. Tôi nghĩ bạn đã trả lời một chủ đề khác của tôi. Cảm ơn vì đã giúp ích. đầu vào của bạn được nhiều đánh giá cao. – dell116

+0

@ dell116: Không sao cả, tôi cố gắng giúp tôi ở đâu. Về vấn đề này, để đơn giản hóa mọi thứ, bạn chỉ có thể mở rộng (thay vì làm lại) mã của bạn để sử dụng AlarmManager để cả hai bắt đầu/dừng dịch vụ của bạn và cũng hoạt động như bộ đếm thời gian nội bộ. AlarmManager là, sau khi tất cả, chỉ là một điểm truy cập vào các dịch vụ báo động hệ thống/thiết bị - các dịch vụ báo động giống nhau đánh thức mọi người vào buổi sáng, cung cấp lời nhắc sinh nhật vv – Squonk

+0

Tôi về cơ bản đã làm những gì bạn nói. Thay vì có thông báo kích hoạt alarmManager bên trong dịch vụ, tôi đã xóa Trình báo thức khỏi dịch vụ và sử dụng Bộ hẹn giờ bên trong dịch vụ để kích hoạt thông báo tại các khoảng thời gian do người dùng xác định. Trong hoạt động cài đặt chính của tôi, tôi sử dụng nút để kích hoạt dịch vụ VÀ bắt đầu của AlarmManager. Sau đó, với sự giúp đỡ của Calandar, tôi có AlarmManager ngừng dịch vụ tại ví dụ ngày Calandar tiếp theo của sleepHour và sleepMinute. Nó hoạt động chính xác như tôi muốn. Một lần nữa, cảm ơn sự giúp đỡ của bạn! – dell116

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