我要做的是编写一个登录我的电子邮件帐户的应用程序,并按照用户设定的常规时间检查收件箱和已发送邮件。
我有一些问题,所以我希望不会因为它的长度而忽略它。
BroadcastReceiver
才能在手机完成启动后启动AlarmManager
。AsyncTask
来读取主UI线程中的电子邮件。但是,我读Service
也在不同的线程上运行?PendingIntent
中的AlarmManager
(为什么PendingIntent
而不是正常Intent
?)我应该选择getBroadcast()
还是getService()
?BroadcastReceiver
获取活动并设置AlarmManager
AlarmManager
在特定时间点击Intent
BroadcastReceiver
获取活动BroadcastReceiver
启动Service
Service
启动AsyncTask
是吗?看起来很啰嗦。如果我选择getService()
代替getBroadcast()
作为PendingIntent
,我可以跳过上述步骤中的第二次广播,直接转到Service
吗?
重读这个我想我没有问过具体的问题,但我更有兴趣知道我的理解是否正确,或者我是否完全失去了(我觉得我是!)
更新:我想我会使用他们听起来不错的意图服务,因为我可以直接从闹钟管理员那里给他们打电话。然而,阅读它似乎服务可能不会保持足够长的清醒,所以我可能不得不使用广播接收器,以便使用唤醒锁定,我现在正在进一步研究。
Commonsware编写了一个名为WakefulIntentService的有用包装器,我想我会用它来帮助我做自己的唤醒锁定东西
答案 0 :(得分:2)
您可以使用AlarmManager
开始Service
(getService()
)。并注意Service
在UI线程上运行。因此,您无法在Service
中建立网络连接(以避免NetworkOnMainThreadException
)。您需要在Thread
中使用Service
之类的内容,不要使用AsyncTask
,因为the document说:
理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)
另一个选择是IntentService
,它在一个单独的工作线程上运行,你可以在那里做网络工作。请注意:所有请求都在一个工作线程上处理 - 它们可能需要多长时间(并且不会阻止应用程序的主循环),但一次只能处理一个请求。
答案 1 :(得分:0)
我没有为您提供所有答案,但我会告诉您我所知道的事情:
3. PendingIntent
是一个等待的意图,区别在于此意图将来发送,而不是像常规意图那样立即发送。
服务启动AsyncTask
服务不需要启动AsyncTask
,你可以在后台运行一个不断运行在另一个线程上的服务。或者你可以使用一个AsyncTask
来创建一个线程,执行它的工作并在最后终止线程。