使用服务上的处理程序更新应用程序窗口小部件

时间:2016-03-07 14:06:02

标签: java android service widget handler

我希望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);
}

这是更新小部件的最佳方法吗?因为这意味着用户可以使用任务杀手来终止服务,这将导致小部件无法正常运行,如果设备重新启动,则服务将无法运行。那么如何摆脱这个并更新小部件呢?或者是否有更有效的方法来非常频繁和可靠地更新小部件?感谢。

1 个答案:

答案 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,因此您的流程将恢复生机,您的小部件仍可正常运行

此外,如果您正在使用小部件,则可能需要查看AppWidgetProviderhttp://developer.android.com/reference/android/appwidget/AppWidgetProvider.html)。它专门用于创建和控制小部件