我希望Android应用小部件定期更新。我为此目的使用Handler
,因为我希望它更频繁地更新(一分钟一次)。在Handler
调用窗口小部件时声明onEnabled()
按预期工作。但它有时会失败。小部件无法升级,通过记录我发现Handler
变为null
。所以我声明了Service
来更新小部件并声明Handler
并使用它进行更新。现在我的所有小部件都在onEnabled()
通话中启动服务,并在onDisabled()
通话时停止服务。 Service
始终在运行并更新小部件。代码:
public void onCreate() {
super.onCreate();
handler=new Handler();
runnable=new Runnable() {
@Override
public void run() {
ComponentName appWidget=new ComponentName(getApplicationContext().getPackageName(),widget.class.getName());
AppWidgetManager widgetManager= AppWidgetManager.getInstance(getApplicationContext());
int ids[]=widgetManager.getAppWidgetIds(appWidget);
for(int id:ids)
{
RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widgetLayout);
//Update Widget here
widgetManager.updateAppWidget(id, views);
}
handler.postDelayed(runnable, delay);
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
handler.post(runnable);
return super.onStartCommand(intent, flags, startId);
}
这是更新小部件的最佳方法吗?因为这意味着用户可以使用任务杀手来终止服务,这将导致小部件无法正常运行,如果设备重新启动,则服务将无法运行。那么如何摆脱这个并更新小部件呢?或者是否有更有效的方法来非常频繁和可靠地更新小部件?感谢。
答案 0 :(得分:0)
为了更加确定您不会遇到不正确的行为,您应该从流程中删除它,并让其他组件处理您的更新间隔。 AlarmManager
有一个可以为您执行此操作的功能:public void setRepeating (int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
。
您可以像这样使用
AlarmManager aManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
aManager.setRepeating(/*clock_type*/, /*first trigger*/, /*update time*/, /*action*/);
您可以在此处找到文档:http://developer.android.com/reference/android/app/AlarmManager.html
通过将您想要的功能移动到AlarmManager
,您的应用程序是否被杀死并不重要。由于AlarmManager
会向您发送新的Intent
,因此您的流程将恢复生机,您的小部件仍可正常运行
此外,如果您正在使用小部件,则可能需要查看AppWidgetProvider
(http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html)。它专门用于创建和控制小部件