如何在后台使用服务更新android小部件

如何在后台使用服务更新android小部件,android,service,widget,android-widget,alarmmanager,Android,Service,Widget,Android Widget,Alarmmanager,我在小部件方面有困难,我需要你的帮助。 我想在1分钟内更新小部件。我使用的方法是用alarmmanger设置一个计时器来启动更新小部件的服务。但它在后台不起作用,只有在mainactivity处于活动状态时才起作用 下面是我的代码 myWidgetProvider: private static final int UPDATE_DURATION = 60 * 1000; @Override public void onUpdate(Context context, AppWidgetMan

我在小部件方面有困难,我需要你的帮助。 我想在1分钟内更新小部件。我使用的方法是用alarmmanger设置一个计时器来启动更新小部件的服务。但它在后台不起作用,只有在mainactivity处于活动状态时才起作用

下面是我的代码

myWidgetProvider:

private static final int UPDATE_DURATION = 60 * 1000; 

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime(),UPDATE_DURATION,createPendingIntent(context));

    final int N = appWidgetIds.length;
    for (int i=0; i<N; i++){
        int appWidgetId = appWidgetIds[i];
        RemoteViews views = new RemoteViews(context.getPackageName(),R.layout.quotes_layout);
        views.setTextColor(R.id.quotes_textview,Color.WHITE);
        appWidgetManager.updateAppWidget(appWidgetId,views);
    }

}


private PendingIntent createPendingIntent(Context context){
    Intent alarmIntent = new Intent(context,TimerService.class);

    PendingIntent pendingIntent = PendingIntent.getService(context,0,alarmIntent,PendingIntent.FLAG_UPDATE_CURRENT);
    return pendingIntent;
}


@Override
public void onDisabled(Context context) {
    super.onDisabled(context);

    AlarmManager manager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    manager.cancel(createPendingIntent(context));
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {

    //Internet request and update widgets

    return super.onStartCommand(intent, flags, startId);
}
使用上面的代码从服务中更新文本,您可以执行其他操作,如在textview中设置文本的颜色。或者控制它的可见性


而不是后台服务,你可以使用服务或,两者都可以工作,即使主活动被破坏。但JobService对android 9+的优化程度更高。

更好的解决方案:p。
 @Override
     public void onCreate() {
            super.onCreate();
         RemoteViews remoteView = new RemoteViews(context.getPackageName(), R.layout.app_widget);
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    remoteView.setTextViewText(R.id.coffee_quote, getRandomQuote(context))  //changing text...
    ComponentName thisWidget = new ComponentName(context, MyWidgetProvider.class);
    appWidgetManager.updateAppWidget(thisWidget, remoteView);
     }