定期阅读电子邮件

时间:2013-03-06 00:33:49

标签: android android-asynctask android-service alarmmanager android-broadcast

我要做的是编写一个登录我的电子邮件帐户的应用程序,并按照用户设定的常规时间检查收件箱和已发送邮件。

我有一些问题,所以我希望不会因为它的长度而忽略它。

  1. 我想我需要BroadcastReceiver才能在手机完成启动后启动AlarmManager
  2. 我需要执行AsyncTask来读取主UI线程中的电子邮件。但是,我读Service也在不同的线程上运行?
  3. 来自PendingIntent中的AlarmManager(为什么PendingIntent而不是正常Intent?)我应该选择getBroadcast()还是getService()
  4. 我对整个过程的理解是:
    • 手机完成启动,触发广播
    • BroadcastReceiver获取活动并设置AlarmManager
    • AlarmManager在特定时间点击Intent
    • BroadcastReceiver获取活动
    • BroadcastReceiver启动Service
    • Service启动AsyncTask
  5. 是吗?看起来很啰嗦。如果我选择getService()代替getBroadcast()作为PendingIntent,我可以跳过上述步骤中的第二次广播,直接转到Service吗?

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

    更新:我想我会使用他们听起来不错的意图服务,因为我可以直接从闹钟管理员那里给他们打电话。然而,阅读它似乎服务可能不会保持足够长的清醒,所以我可能不得不使用广播接收器,以便使用唤醒锁定,我现在正在进一步研究。

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

2 个答案:

答案 0 :(得分:2)

您可以使用AlarmManager开始ServicegetService())。并注意Service在UI线程上运行。因此,您无法Service中建立网络连接(以避免NetworkOnMainThreadException)。您需要在Thread中使用Service之类的内容,不要使用AsyncTask,因为the document说:

  

理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)

另一个选择是IntentService,它在一个单独的工作线程上运行,你可以在那里做网络工作。请注意:所有请求都在一个工作线程上处理 - 它们可能需要多长时间(并且不会阻止应用程序的主循环),但一次只能处理一个请求。

答案 1 :(得分:0)

我没有为您提供所有答案,但我会告诉您我所知道的事情:

3. PendingIntent是一个等待的意图,区别在于此意图将来发送,而不是像常规意图那样立即发送。

  

服务启动AsyncTask

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