【问题标题】:Reading email at regular intervals定期阅读电子邮件
【发布时间】:2013-03-06 00:33:49
【问题描述】:

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

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

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

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

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

更新:我想我会使用他们听起来不错的意图服务,因为我可以直接从警报管理器中调用它们。但是,仔细阅读后发现,服务可能无法保持足够长的唤醒时间,因此我可能不得不使用广播接收器才能使用唤醒锁,这是我现在正在进一步调查的问题。

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用AlarmManager 来启动Service (getService())。并注意 Service 在 UI 线程上运行。所以你不能Service 中建立网络连接(以避免NetworkOnMainThreadException)。你的Service 中需要Thread 之类的东西,不要使用AsyncTask,正如the document 所说:

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

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

    【讨论】:

    • 有趣的是,该文件说它们适用于短期任务,而我读过的其他任何地方都说它们适用于长期任务。我想我现在还是要使用 intentservice,谢谢
    【解决方案2】:

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

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

    服务启动 AsyncTask

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

    【讨论】:

    • 如果不在服务中,我应该从哪里调用异步任务?来自监听警报的广播接收器?
    • 您可以从每个需要执行可能会阻塞 UI 线程的可能较长任务的位置调用 AsyncTask。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2012-12-28
    相关资源
    最近更新 更多