0

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

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

  1. 我想我需要在手机完成启动后启动BroadcastReceiverAlarmManager
  2. 我需要AsyncTask从主 UI 线程中读取电子邮件。但是,我读Service的 s 也运行在单独的线程上?
  3. 从中(为什么这是PendingIntent不正常的?)我应该选择还是?AlarmManagerPendingIntentIntentgetBroadcast()getService()
  4. 我对整个过程的理解是:
    • 手机完成启动,触发广播
    • BroadcastReceiver获取事件并设置AlarmManager
    • AlarmManagerIntent在特定时间开火
    • BroadcastReceiver获取事件
    • BroadcastReceiver开始Service
    • Service开始AsyncTask

那正确吗?似乎很啰嗦。如果我选择getService()而不是getBroadcast()asPendingIntent我可以跳过在上述步骤中调用第二个广播,并直接转到Service

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

更新:我想我会使用他们听起来不错的意图服务,因为我可以直接从警报管理器中调用它们。然而,阅读它似乎服务可能不会保持足够长的时间,所以我可能不得不使用广播接收器才能使用唤醒锁,我现在正在进一步调查。

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

4

2 回答 2

2

您可以使用( )AlarmManager开始。以及在 UI 线程上运行的注释。所以你不能在 a 中建立网络连接(以避免)。正如文档所述,您需要类似in your , don't use的东西:ServicegetService()ServiceServiceNetworkOnMainThreadExceptionThreadServiceAsyncTask

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

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

于 2013-03-06T01:00:40.283 回答
0

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

3.PendingIntent是一个等待的 Intent,不同之处在于这个 Intent 打算在将来发送,而不是像常规 Intent 那样立即发送。

服务启动 AsyncTask

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

于 2013-03-06T00:49:28.393 回答