【问题标题】:How can repeating AlarmManager start AsyncTask?重复AlarmManager如何启动AsyncTask?
【发布时间】:2014-08-14 08:51:02
【问题描述】:

我通常编写此代码以使用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。如果有更好的方法可以每 X 秒/分钟运行一次AsyncTask,请提出!

【问题讨论】:

  • 只是出于好奇……为什么?您是否有特殊原因需要 AsyncTask 而不是 Service
  • @kabuko 此任务应该仅在应用程序打开(UI 可见)时工作,因此当我可以简单地调用已经存在的 AsyncTask 时,没有使用服务和双重编码的目的。我知道我可以使用Timer,但我不确定这是否正确,因为通常不建议在重复任务中使用它。

标签: android android-asynctask alarmmanager


【解决方案1】:

根据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);

以上代码配置AlarmManagerAlarmReceiver开火,其定义如下:

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

如果发生警报AlarmReceiver 启动MyAsyncTask

这里有龙

life cycle issues 与从WakefulBroadcastReceiver 实例化AsyncTask 相关联,即上述解决方案可能导致MyAsyncTask 被过早杀死。另外,threading rules are violated.

【讨论】:

【解决方案2】:

你可以这样做:

1.) 定义一个静态意图(intent1)并在设置时间时使用它传递给AlarmManager。所以现在无论何时,都会过去; AlarmManager 将通过发送 intent1 进行通知。

2.) 在intent1 的BroadcastReceiver 的onReceive 上,启动一个AsyncTask。在AsyncTask结束时,为AlarmManager设置下一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多