Как обновить виджет с помощью сервиса - PullRequest
0 голосов
/ 31 августа 2018

Необходимо обновлять TextView виджета часов каждую секунду или каждый раз, когда меняется минута.

Я звоню в сервис из onReceive моего AppWidgetProvider:

 private String action = "clock.beautiful.best.com.mmclock.TheService";


@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);


 //UseThis


    Log.e("h","R");


    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.main_widget);

    // Create a fresh intent
    Intent serviceIntent = new Intent(context, TheService.class);

   serviceIntent.setAction(action);

   context.startService(serviceIntent);


    ComponentName componentName = new ComponentName(context, TheService.class);
    AppWidgetManager.getInstance(context).updateAppWidget(componentName, remoteViews);




}

Что я должен сделать, чтобы проверить наличие обновлений во времени и, если есть, обновить текстовое представление 'time' ..

Сервис:

public class TheService extends Service {

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {

    Log.e("Service","created");



}


@Override
public void onDestroy() {

    Log.e("Service","Destroy");

}

public void changeYexy (){

    RemoteViews remoteViews = new RemoteViews(TheService.this.getPackageName(), R.layout.main_widget);

    remoteViews.setTextViewText(R.id.dateTextView,"T");



}


@Override
public void onStart(Intent intent, int startid) {
    Log.e("Service","start");


    }
}

Я не хочу, чтобы пользователи снова и снова открывали активность, чтобы обновить ее, есть ли способ проверить и обновить время из службы или виджета ...

Любой вид действительно очень ценится

1 Ответ

0 голосов
/ 09 октября 2018

Вместо использования сервиса вы можете использовать AlarmManager для периодического обновления виджета

public class Alarm
{
    public static void setAlarm(Context context, int interval)
    {
        AlarmManager am =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(context, yourWidget.class);
        intent.setAction("WIDGET_UPDATE");
        int[] ids = AppWidgetManager.getInstance(context)
                .getAppWidgetIds(new ComponentName(context, yourWidget.class));
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);

        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);

        am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + interval * 1000, pi);
    }

    public void cancelAlarm(Context context)
    {
        Intent intent = new Intent(context, Alarm.class);
        PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(sender);
    }
}

таким образом, alram отправляет broadCast виджету с «WIDGET_UPDATE» в качестве действия после интервала секунд.

Включить будильник в методе onEnable вашего виджета:

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

    Alarm.setAlarm(context, 1);

}

В методе onReceive вашего виджета обновите ваш виджет и установите будильник на следующий раз

@Override
public void onReceive(Context context, Intent intent) {

    super.onReceive(context, intent);

    if ("WIDGET_UPDATE".equals(intent.getAction())) {

        int[] appWidgetIds = AppWidgetManager.getInstance(context)
                    .getAppWidgetIds(new ComponentName(context, yourWidget.class));

        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);

        //set alarm for the next time
        Alarm.setAlarm(context, 1);

        //update your widget here
        onUpdate(context, appWidgetManager, appWidgetIds);      

    }
}

Примечание : хотя можно использовать setRepeating вместо setExact, но для меня это не работает должным образом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...