【问题标题】:how can I update android widgets with service in background如何在后台使用服务更新 android 小部件
【发布时间】:2020-10-03 09:21:09
【问题描述】:

我在使用小部件时遇到了问题,需要您的帮助。 我想在 1 分钟内更新小部件。我使用的方式是使用警报管理器设置一个计时器来启动一个更新小部件的服务。但是它在后台不起作用,只有在 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);
}

【问题讨论】:

    标签: android service widget android-widget alarmmanager


    【解决方案1】:
     @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);
         }
    

    使用上面的代码从服务更新文本,你可以做其他事情,比如在 textview 中设置文本颜色。或控制其可见性。

    您可以使用 foreground 服务或 JobService 代替后台服务,即使 mainActivity 被破坏,两者都可以工作。但 JobService 更适合 android 9+。

    【讨论】:

    • 更好的解决方案:P.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多