2011-01-19 59 views
11

我建立一個應用程序,將用戶醒着時觸發在特定的時間間隔通知執行進度的通知。使用alarmManager和服務只在特定的時間段

我有一個在服務內部運行的alarmManager。該服務通過主要活動上的按鈕單擊顯式啓動,並使警報管理器在特定時間間隔內執行通知。我將如何在一天中的特定時間內停止通知?例如,當用戶正在睡覺時,我不希望這些通知被解僱。

我的代碼,目前在用戶設定的時間間隔發射通知低於(進口刪除....這是夠長的話):

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); 
    } 
} 

.....我的廣播接收器在這裏實現:

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); 
    } 
} 

我在圍繞如何實現這個方面有點困難。

我在想,這樣的alarmManager在waketime解僱,停在睡眠時間,而所有的服務中是火災在特定時間間隔通知方法的計時器返工這個代碼?有沒有更好的方式去做這件事?

任何輸入,將不勝感激。我一直試圖在我的腦海中解決這個問題好幾天。

感謝

編輯: @anyone誰遇到這種打算使用日常通知的計時器:

該服務的內部運行將運行被暫停時,該設備的計時器進入睡眠狀態(即...用戶將手機置於待機狀態)。因此,使用定時器在特定時間間隔觸發通知將無法在服務中正常工作,因爲當Android暫停服務時,它也暫停定時器,從而拋出間隔。

正確的方式做,這是使用AlarmManager未決的意圖在白天設置在特定時間報警的數組。這確保即使手機處於待機狀態,通知(或當時想要發生的任何事情)仍將被執行。

+0

`mySharedPreferences.getBoolean`失蹤 - 在`// TODO:操作是created`is需要服務時執行? (至少有問題 - 另一個TODO可以)另外爲什麼要使用(長時間運行)服務? – 2013-03-16 18:02:01

+1

@Mr_and_Mrs_D - 我最終使用AlarmManager類和一個未決意圖數組來完成這個任務。 – dell116 2013-03-18 16:48:34

回答

3

我在考慮重寫這段代碼,以便在醒來時觸發alarmManager並在sleepTime停止,而在服務內部的所有時間都是一個Timer,它以特定的時間間隔觸發通知方法?有沒有更好的方式去做這件事?

在我看來,忘記思考「更好」的方式,這似乎是唯一的方法。使用定時器來控制(啓用/禁用)另一個定時器並不奇怪,對我來說完全有意義。

相關問題