定期读电子邮件

问题描述:

我在做的是编写一个应用程序,该应用程序登录到我的电子邮件帐户并在用户设置的常规时间内检查收件箱和已发送邮件。定期读电子邮件

我有几个疑问,所以我希望这不会被忽略,因为它的长度。

  1. 我想我需要一个BroadcastReceiver手机完成启动后开始AlarmManager
  2. 我需要做一个AsyncTask来读取主UI线程中的电子邮件。但是,我读Service s也运行在不同的线程?
  3. PendingIntent中的AlarmManager(为什么是这个PendingIntent而不是正常的Intent?)我应该选择getBroadcast()还是getService()
  4. 我的整个过程的理解是:
    • 电话完成引导,火灾广播
    • BroadcastReceiver获取事件并设置AlarmManager
    • AlarmManager火灾Intent在特定的时间
    • BroadcastReceiver获取事件
    • BroadcastReceiver开始Service
    • Service开始AsyncTask

是吗?看起来很啰嗦。如果我选择getService()而不是getBroadcast()作为PendingIntent,我可以跳过上述步骤中的第二个广播,然后直接转到Service

重读这个我想我还没有问具体的问题,但我更想知道,如果我的理解是正确的,或者如果我完全失去了(我觉得我!)

更新:我想我会使用intentservice它们听起来不错,因为我可以直接从alarmmanager调用它们。然而,围绕它看来服务可能不会保持足够长的时间,所以我可能不得不使用广播接收器来使用唤醒锁,这一点我现在正在进一步研究。

Commonsware写称为WakefulIntentService一个有用的包装,我想我会用它来帮助我自己做的唤醒锁的东西

我没有对你所有的答案,但我会告诉你我所知道:

3. PendingIntent是一个等待中的意图,不同之处在于此意图打算在将来发送,而不是立即作为常规意图发送。

服务启动的AsyncTask

服务并不需要启动AsyncTask,你做其中的一个或者您运行,将在不同的线程运行不断在后台的服务。或者你可以使用一个AsyncTask来创建一个线程,执行它的工作并在最后终止线程。

+0

如果不是在服务中,我该从哪里调用asynctask?从广播接收机收听警报? – 2013-03-06 09:03:48

+0

您可以从每个需要执行可能会阻止您的UI线程的长任务的位置调用AsyncTask。 – 2013-03-06 11:35:52

您可以使用AlarmManager开始ServicegetService())。并注意Service在UI线程上运行。所以你不能做一个Service网络连接(以避免NetworkOnMainThreadException)。你需要在你ServiceThread,不使用AsyncTask,为the document说:

AsyncTasks应该理想地(最多几秒钟。)

另一种选择用于短期操作是IntentService,它在单独的工作线程上运行,您可以在那里执行网络作业。请注意:所有请求都在单个工作线程上处理 - 它们可能需要尽可能长(并且不会阻塞应用程序的主循环),但一次只能处理一个请求。

+0

有趣的是,该文件说,他们是为了短期任务,我读过的其他地方说他们是为了长时间的工作。无论如何,我现在要使用intentservice,谢谢 – 2013-03-07 00:00:34