NiT*_*hDi 6 service networking android widget
我对Android小部件尤其是Android服务有疑问.这就是我想要做的事情:在手机上,用户应该能够将我的小部件添加到他的主屏幕.小部件从网络获取其数据.在阅读了一些有关此问题之后,我发现最好的方法是创建一个从网络(TCP套接字)获取数据然后不断更新小部件的服务.这是通过ScheduledExecutorService完成的,它在某个时间间隔内执行Runnable.Runnable将连接到服务器,获取数据并应更新小部件).
我现在的问题是,当屏幕关闭时,小部件不需要更新,因此由于电池耗尽,服务不应该运行.我的问题是:如何做到最好的方式?
我找到了两种或多或少做我想要的方法:
当小部件的第一个实例添加到主屏幕时,它将注册一个广播接收器,该接收器从Android OS接收ACTION_SCREEN_ON和ACTION_SCREEN_OFF意图动作.如果触发ACTION_SCREEN_ON,它将启动更新程序服务,否则将停止它.但由于广播接收器的使用寿命,我真的不确定这是否是一个好方法.
在更新程序服务的Runnable中,它由ScheduledExecutorService定期执行并实际执行网络内容,如果屏幕打开,我通过PowerManager.isScreenOn()进行检查.如果是,我执行网络代码,否则不执行.但是什么时候设备处于待机状态?这个代码执行了吗?电池耗尽怎么样?
对于我想做的事情,是否可能采用"最佳实践"方法?我已经阅读了很多关于AlarmManager的信息,它是一个非常强大的工具.您是否可以通过此方式安排任务,只有在显示器打开时才会执行?
谢谢你的帮助.
最诚挚的问候NiThDi
您的第一个解决方案(小部件处理屏幕打开和关闭广播)就是要走的路。启动一个新的IntentService以与应用程序服务器进行后台通信。完成后,发送带有结果的自定义“已完成”广播,然后在小部件中处理它。
作为一个额外的好处,它允许您的小部件的多个实例从一个“源”工作,并且在用户没有添加任何小部件的情况下不会消耗任何资源。
更新由于不可能使用小部件使用屏幕开/关广播,我可能会使用它(带有ELAPSED_REALTIME(非ELAPSED_REALTIME_WAKEUP)警报的 AlarmManager)来安排(意图)服务运行。这样,当屏幕关闭时,您的服务将不会被安排,但会在屏幕打开时定期运行。如果屏幕打开和关闭之间的延迟超过该时间段,它将在屏幕恢复打开时立即运行。
至于您关于广播接收器生命周期的问题,如前所述,将 IntentService 用于长时间运行的任务,然后从中广播您的结果。当您启动服务时,调用不会阻塞,因此广播接收器将及时完成。
更新 2根据此屏幕,关闭并不意味着设备正在睡眠。您已经通过使用 PowerManager.isScreenOn() 找到了此问题的解决方案。