2016-05-25 40 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' 



} 

}

相关问题