【问题标题】:How to update a widget using a service如何使用服务更新小部件
【发布时间】:2019-02-06 10:19:08
【问题描述】:

需要每秒或每次分钟更改时更新时钟小部件的 TextView ..

我正在从我的 AppWidgetProvider 的 onReceive 调用该服务:

 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);




}

我应该怎么做才能及时检查更新,如果有则更新'时间'TextView..

服务:

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");


    }
}

我不希望用户一次又一次地打开活动来更新,有什么办法可以检查和更新服务或小部件的时间..

任何一种真的真的真的很感激

【问题讨论】:

    标签: java android service widget broadcastreceiver


    【解决方案1】:

    您可以使用 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);
        }
    }
    

    以这种方式,警报会在间隔秒后以“WIDGET_UPDATE”作为操作向小部件发送广播。

    在您的小部件的 onEnable 方法中启用警报:

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
    
        Alarm.setAlarm(context, 1);
    
    }
    

    在 yourWidget 的 onReceive 方法中更新 yourWidget 并设置下次闹钟

    @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 是可能的,但对我来说它不能正常工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多