Android应用开发之(如何实时高效的更新Widget)

Android系统提供了一个Widget机制,可以让信息直接在主屏中显示,这样对于一些经常访问的信息不需要打开应用程序即可获取到,方便了用户。iOS5也抄袭了这种方式。Android系统的Widget可以在配置文件中通过updatePeriodMillis属性来控制该Widget数据的更新周期,时间到后系统会发送一个更新请求告诉该Widget需要更新数据了。 但是出于节约用户电量的考虑,Android系统默认最小更新周期是30分钟,也就是说:如果您的程序需要实时更新数据,设置这个更新周期是2秒,那么您的程序是不会每隔两秒就收到更新通知的,而是要等到30分钟以上才可以。

为了处理这种情况,可以把updatePeriodMillis这个值设置为0。这样的话,Android系统就不会触发更新通知,而是有应用程序自己来处理更新逻辑。

但是如果网络数据频繁更新,既浪费用户网络流量也耗费用户设备电池使用时间。如何才能做到按需更新呢?

由于Widget是在一个RemoteViews中显示的,而目前无法判断该Widget是否对用户可见。因此目前只能通过如下两个方法来实现按需更新:

  1. 判断当前用户是否在操作Launcher(Android系统的主屏),如果是且该主屏上添加有该Widget则更新数据;

  2. 判断是否有有效数据需要更新,如果没有则停止更新,使用缓存数据。 这个典型情况就是股市行情软件,股市在交易时间内每秒钟都有变化,而在闭市后是没有变化的。 所以在闭市情况下就无需频繁更新数据了。 这种情况和具体的业务逻辑有关系, 就不再详细讨论了。

由于Android系统是一个开放的平台,用户可以安装多个Launcher程序,然后在每个Launcher中都添加上您的Widget。 所以就要尽量做到 当用户在使用哪个Launcher的时候就只更新该Launcher中的Widget即可。

如何实现?

在Widget添加到主屏后,会调用如下函数来更新Widget内容:
android.appwidget.AppWidgetProvider.onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)

而一般而言,用户在添加Widget时,都是在需要显示Widget的那个程序中操作, 所以可以在上面的函数中,获取当前用户正在操作的程序的包名称。获取当前正在运行的程序包名称的代码如下:
String currentRunningPackageName = ((ActivityManager.RunningTaskInfo)
((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).
getRunningTasks(1).get(0)).baseActivity.getPackageName();

同时 在onUpdate函数中还包含了刚添加的Widget ID:appWidgetIds
对于添加Widget操作来说,该ID数组的长度应该为1.

然后把这Widget ID和获取到的该Widget添加到的程序的包名保存起来,也就是记录下在哪个主屏(程序)中添加了哪个Widget(通过ID来标示)。

这里需要注意的是:需要判断该ID是否已经存在,如果已经保存过了, 说明不是刚刚添加的Widget,而是一个已经存在的Widget,这个时候按照正常流程更新数据。

有了上面保存的每个Widget(通过ID标示)添加到哪个主屏中的信息,然后即可以根据当前运行的程序包名来更新对应的Widget了。 如果用户安装了新的主屏程序,但是没有在该主屏程序中添加Widget,经过上面的判断,就可以不用更新数据了。

这样就可以做到尽可能的按需更新数据了。 最大限度的节约用户的网络流量和设备电池寿命。



原文转载自 云在千峰: http://yunfeng.sinaapp.com/?p=351#ixzz1pkHHog8j

你可能感兴趣的:(Android)