我将创建一个小部件,它需要每分钟更新其内容(显示与时间相关的数据)。
但是,如果小部件当前不可见,则无需更新小部件,这意味着:
- 屏幕已关闭
- 另一个应用正在运行
- 小部件放置在另一个(不可见的)主屏幕选项卡上
最佳方法是如何每分钟仅更新可见小部件-而不唤醒设备或执行不必要的计算?在小部件变为可见之前,短暂的更新延迟是可以接受的。
我将创建一个小部件,它需要每分钟更新其内容(显示与时间相关的数据)。
但是,如果小部件当前不可见,则无需更新小部件,这意味着:
最佳方法是如何每分钟仅更新可见小部件-而不唤醒设备或执行不必要的计算?在小部件变为可见之前,短暂的更新延迟是可以接受的。
尽管上面关于AlarmManager的答案是正确的,但可能不足够,因为我观察到许多手机即使它们不是*_WAKEUP类型也会传递警报。如果安装了其他唤醒设备的应用程序,则可能会发生这种情况。一旦它唤醒,就会传递所有未决的警报。
我在Google Code的项目24clock中找到了这个。它试图在用户离开家时不更新小部件:
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<RunningTaskInfo> runningTasks = am.getRunningTasks(2);
for (RunningTaskInfo t : runningTasks) {
if (t != null && t.numRunning > 0) {
ComponentName cn = t.baseActivity;
if (cn == null) continue;
String clz = cn.getClassName();
String pkg = cn.getPackageName();
// TODO make this configurable
if (pkg != null && pkg.startsWith("com.android.launcher")) {
return true;
}
return false;
}
}
mbaird的回答非常到位。如果实现了建议的onVisivilityChange()
方法,应该可以涵盖上述所有情况。
与此同时,对于某些类型的小部件来说,这仍然是一个真正的问题。jom引入了注册以接收ACTION_SCREEN_OFF/ACTION_SCREEN_ON意图的可能性。这很有用,因为依赖于非唤醒重复闹钟是不够的,其他服务可能导致唤醒。这很困难,因为这些操作无法通过AndroidManifest.xml进行订阅,并且AppWidgetProvider不允许调用context.registerReceiver()
。这些问题在其他几个StackOverflow问题中讨论,包括监听ACTION_SCREEN_OFF, android.intent.action.SCREEN_ON作为接收器意图过滤器不起作用和Android - 如何接收广播意图ACTION_SCREEN_ON/OFF?。
IntentService
来处理相对昂贵的工作,其中包括持久的网络连接。这是必要的,以便近乎实时地监视远程服务的状态。