【发布时间】:2013-01-18 15:10:43
【问题描述】:
我有一个关于 Android 小部件,尤其是 Android 服务的问题。这是我想要做的:在手机上,用户应该能够将我的小部件添加到他的主屏幕。小部件从网络获取数据。 在阅读了一些关于此的教程后,我发现最好的方法是创建一个从网络(TCP 套接字)获取数据的服务,然后不断更新小部件。这是通过 ScheduledExecutorService 完成的,它在一定的时间间隔内执行 Runnable。 Runnable 将连接到服务器,获取数据并更新小部件)。
我现在的问题是,屏幕关闭时不需要更新小部件,因此由于电池耗尽,服务不应该运行。我的问题是:如何做到最好?
我发现 2 种方法或多或少可以满足我的需求:
当小部件的第一个实例添加到主屏幕时,它将注册一个广播接收器,该接收器接收来自 Android 操作系统的 ACTION_SCREEN_ON 和 ACTION_SCREEN_OFF 意图操作。 如果 ACTION_SCREEN_ON 被触发,它将启动更新程序服务,否则将停止它。但由于广播接收器的生命周期,我真的不确定这是否是一个好方法。
在更新程序服务的 Runnable 中,它由 ScheduledExecutorService 定期执行并实际执行网络工作,我通过 PowerManager.isScreenOn() 检查屏幕是否打开。如果是,我执行网络代码,否则不执行。但是当设备处于待机状态时会怎样?这段代码会执行吗?这里的电池耗电怎么样?
对于我想做的事情,是否有“最佳实践”方法?我读过很多关于 AlarmManager 的文章,它是一个非常强大的工具。你能用这种方式安排任务,只在显示器打开时执行吗?
感谢您的帮助。
最好的问候 镍钛
【问题讨论】:
-
你有没有想过Google Cloud Messaging?这样您就不需要轮询数据(即使仅在设备唤醒时),并且只有在数据发生变化时才会获得新数据。另外,当用户唤醒他的设备时,您将获得显示最新部分的好处,而不会出现任何初始延迟。
-
您好,感谢您的快速答复。我不认为 Google Cloud Messaging 可以做我想做的事。关键是(要清楚),上面提到的服务器不是所有用户的一个服务器。它是在他们的计算机中运行的服务器应用程序。实际上,这个应用程序是一个远程控制,它通过 TCP/IP 连接到局域网中的计算机上的服务器。
标签: android networking service widget