2016-05-25 45 views
2

我需要在android上設置任務來檢查新數據並從遠程服務器上下載它。 基本上我知道如何運行任務,但問題是: 我應該從主thred運行scheduleAlarm()方法嗎?這意味着每次用戶打開應用程序時,都會調用此方法。 它會創建重複的任務嗎? 設置這類任務的正確方法是什麼?如何設置將在每個午夜運行的android任務?

public void scheduleAlarm(){ 
    Calendar date = new GregorianCalendar(); 
    date.set(Calendar.HOUR_OF_DAY, 0); 
    date.set(Calendar.MINUTE, 0); 
    date.set(Calendar.SECOND, 0); 
    date.set(Calendar.MILLISECOND, 0); 

    Intent intentAlarm = new Intent(this, AlarmReciever.class); 

    // create the object 
    AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

    //set the alarm for particular time 
    alarmManager.set(AlarmManager.RTC_WAKEUP,date.getTimeInMillis(), PendingIntent.getBroadcast(this,1, intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT)); 
} 


public class AlarmReciever extends BroadcastReceiver{ 

    ConnectivityManager cm = null; 
    NetworkInfo netInfo = null; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     // exec task download data 
    } 
} 

回答

1

使用PendingIntent啓動執行網絡請求的服務。

PendingIntent.getService(...) 

但是請確保它是一個IntentService或實際的網絡請求中執行異步。

編輯:對不起,我誤解了這個問題。 PendingIntent中的最後一個參數指定PendingIntent已經存在時該怎麼做。在這個例子中,你告訴如果這個PendingIntent已經存在,那麼它應該被更新。因此,只要PendingIntent的參數保持不變,因爲沒有創建新的PendingIntent。根據文檔alarmManager.set將取消您的待處理事件,並安排新的,這意味着將的onReceive被稱爲每個事件一個

+0

所以基本上,我的代碼只會更新呢?並不會創建一個新的任務? – Eli

+0

PendingIntent保持不變。但是,在設置新警報之前,您可以使用AlarmManager.cancel(thePendingIntent)取消任何與PendingIntent相匹配的警報。 – GPuschka

1

https://developer.android.com/training/scheduling/alarms.html

如果要管理任務,只要保持其在激烈AlarmReciever

公共類AlarmReciever擴展廣播接收器{

ConnectivityManager cm = null; 
NetworkInfo netInfo = null; 
Task task; 
@Override 
public void onReceive(Context context, Intent intent) 
{ 
// reschedule alarm 

// check if not null and not finished return or cancel old one and create new 'task' 



} 

}

相關問題