如何能重复AlarmManager开始的AsyncTask?(How can repeating A

2019-07-17 20:31发布

我平时写的代码,开始与服务AlarmManager

    intent = new Intent(getActivity(), someservice.class);
    pendingNotificationIntent = PendingIntent.getService(getActivity(), 0, intent, 0);
    alarm = (AlarmManager) getActivity().getSystemService(getActivity().ALARM_SERVICE);
    int interval = 30 * 1000;
    long now = Calendar.getInstance().getTimeInMillis();
    alarm.setRepeating(AlarmManager.RTC_WAKEUP, now, interval, pendingNotificationIntent);

AsyncTask是我注册的私有类AlarmManager对象。

我如何可以调用AsyncTask ,而不是使用服务的AlarmManager对象?

PS。 如果有更好的方式来运行AsyncTask每X秒/分钟,请申请吧!

Answer 1:

这是你如何做到这一点:

1.)定义静态意图(intent1),并用它设定时间时传递给AlarmManager。 所以,现在当过一次,就会失效; AlarmManager将通过发送intent1通知。

2)在intent1的广播接收器的的onReceive,开始的AsyncTask。 在的AsyncTask结束而终止,设置AlarmManager的下一次。



Answer 2:

基于munish-katoch的回应,我有以下具体的解决方案。

设置闹铃:

Intent intent = new Intent(context, AlarmReceiver.class);

PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);

AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
  SystemClock.elapsedRealtime() + 5 * 1000, 60 * 1000, alarmIntent);

上面的代码配置AlarmManager开火AlarmReceiver ,其被定义如下:

public class AlarmReceiver extends WakefulBroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {  
    new MyAsyncTask.execute();
  }
}

在报警的情况下, AlarmReceiver开始MyAsyncTask

这里是龙

有生命周期的问题与实例相关联AsyncTaskWakefulBroadcastReceiver ,即,上述方案可能会导致MyAsyncTask过早死亡。 此外, 穿线规则违反 。



文章来源: How can repeating AlarmManager start AsyncTask?