2016-02-28 33 views
0

我創建了一項服務,可以在一天中的特定時間和每天(例如上午6點)檢查一些在線數據,而不是使用後臺運行服務和廣播接收器,我決定使用AlarmMananger和下面的代碼:如何讓我的服務在當天的特定時間定期開始

Intent myIntent = new Intent(MainActivity.this, MyAlarmService.class); 
pendingIntent = PendingIntent.getService(MainActivity.this, 0, myIntent, 0); 
AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
calendar.set(Calendar.HOUR_OF_DAY, 6); 
    calendar.set(Calendar.MINUTE, 0); 
    calendar.set(Calendar.SECOND, 0); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

我的問題是:

1 - 如何從AlarmManager註銷時,用戶決定取消激活我的服務?

2 - 有什麼用這條線的

calendar.setTimeInMillis(System.currentTimeMillis()); 

3-會發生什麼,如果我用同樣PARAMS和數據稱爲上面相同的功能,將AlarmMananger覆蓋我的請求,或者將註冊一個新的一個,當時間到了(上午6點)它會打電話給我的服務兩次?

4-是否可以檢查AlarmMananger是否已成功註冊我的意圖?

編輯1:

下面的代碼無法觸發我的廣播接收器,爲什麼?

Calendar calendar = Calendar.getInstance(); 
calendar.set(Calendar.HOUR_OF_DAY, 6); // For 6 AM 
calendar.set(Calendar.MINUTE, 0); 
calendar.set(Calendar.SECOND, 0); 
calendar.set(Calendar.MILLISECOND, 0); 

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, mybroadcastreceiver.class), PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 

AndroidManifest.xml中

<receiver 
     android:name=".mybroadcastreceiver" 
     android:enabled="true" 
     android:exported="true"></receiver> 

回答

0

來到你所有的問題: -

  1. 如何從AlarmManager註銷時,用戶決定取消激活我的服務?

    答:要取消您創建的AlarmService,您需要像這樣取消它。

    this.getAlarmManager().cancel(pendingIntent);

其中this是服務從你叫AlarmService地方(或活動/上下文)。

  • 什麼用這條線的 calendar.setTimeInMillis(System.currentTimeMillis());
  • 那麼如果你知道的方法Date.setTime(),其產生在設置有毫秒Date對象的論據。 Calender.setTimeInMillis()對於日曆對象也是如此。 System.currentTimeMillis()用於提供當前時間與UTC,1970年1月1日午夜之間以毫秒爲單位的差值。 (我猜你知道整個時間戳概念)

    3.如果我用相同的參數和數據調用上面的相同函數,AlarmMananger會覆蓋我的請求或將註冊一個新的請求,時間到了(上午6點),它會打電話給我的服務兩次?

    正如documentation所示,如果已經爲同一個IntentSender安排了一個鬧鐘,則先前的鬧鐘將首先被取消。

    4.如果AlarmMananger已成功註冊我的意圖,可以檢查AlarmMananger嗎?

    我認爲這是可能的,但沒有這種方法直接檢查它,你需要做的破解。我想你會發現this答案合適。

    我希望這可以幫助您:)

    0

    可以使用的if else功能寄存器,並從AlarmManager註銷。 例如checkBox isSelectted()或不。

    calendar.setTimeInMillis(System.currentTimeMillis());

    此行將以毫秒爲單位返回系統時間。這種格式是這樣的「2547889955511」

    是的,如果你可以完美設置AlarmManager你的未決意圖可以調用你的服務兩次。

    是的,你必須設置完美,那麼它可以檢查AlarmMananger它是否成功地註冊了你的意圖。

    +0

    感謝所有這些問題的答案,但這裏有一個問題,我說上面,我在下午6點AlertMananager想每天要打電話給我的接收器的編輯,但是,這並不甚至發生一次,代碼中出了什麼問題?知道我添加了SET_ALARM權限,並且我的接收者沒有被調用相同的結果。 – Jack

    +0

    您是否將輸入數據保存在任何數據存儲中?如果沒有,然後保存。保存與通話AlarmManager的保存時間和系統時間比較後 –

    相關問題