当前位置: 首页 > 知识库问答 >
问题:

如何使用服务更新小部件

茅曾琪
2023-03-14

需要更新时钟小部件的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);




}

我应该做什么来检查更新的时间,如果有,然后更新‘时间’文本视图…

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个答案

岳高明
2023-03-14

您可以使用AlarmManager定期更新小部件,而不是使用service

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在间隔秒后以“widget_update”作为动作向小部件发送广播。

在小工具的onEnable方法中启用警报:

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

    Alarm.setAlarm(context, 1);

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

    }
}
 类似资料:
  • 当我试图从我的web服务器获取SOAP响应时,我的小部件更新服务抛出了一个:“android.os.NetworkOnMainThreadException”。 我确信SOAP代码没有错误,因为我只通过IntentService而不是服务在应用程序中使用相同的代码。 我根据最后一个示例设计了我的小部件:http://www.vogella.com/tutorials/AndroidWidgets/

  • 在RoomDatabase中创建数据库时,一切工作都很好,并且数据已成功加载,但是,我需要更新服务中生成的数据,问题是它需要下一行中的活动上下文: Dao接口: 存储库: 服务: 我希望服务在LiveData列表中执行、保存和刷新新结果,但我不能声明LiveData列表。

  • 情况: 在我的网站上。com/game,我在 在我的服务器上,的最大值为。 问题: 。 问题是,每当用户访问,它显示空页面,不再执行任何操作。我无法让客户端获取新的。 如何让客户端获取新的?

  • 如果用户第一次安装我的应用程序,我如何构建我的Inno安装脚本以自动注册dll,但如果有一个以前的版本,则取消注册,然后注册新版本(假设界面不同)? 我目前在我的文件部分使用regserver和忽略reversion标志,如下所示: 在我的谷歌搜索中,我找到了Un注册表服务器,但我不知道如何将其添加到我的脚本中。我很乐意开始修补以了解它是如何工作的,但我不想做任何会弄乱我的注册表的事情。 这里有一

  • 问题内容: 下面显示的是我班的简化版本。我在onReceive方法上遇到了麻烦,该方法没有更新小部件TextView。它在logcat中显示正确的信息,该信息在setTextViewText之前的行上输出。我不确定出什么问题了,并且一直在拔头发(而且我已经秃顶了)。 } 问题答案: 找到了答案。调用后,您需要通过调用来更新窗口小部件。我添加的代码如下所示。

  • 问题内容: 我们正在使用Django / TastyPie作为后端REST服务提供程序来构建Web应用程序,并使用大量基于$ resource的服务对服务器上的CRUD对象进行构建,从而构建基于AngularJS的前端。到目前为止一切正常! 但是, 当我们只想更新一个对象上的一个或两个更改的字段时,我们想减少要传送的数据量。 DeliciousPie使用HTTP PATCH方法支持此功能。我们在对