小部件onUpdate调用一次

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小部件onUpdate调用一次相关的知识,希望对你有一定的参考价值。

我尝试创建android小部件:

public class MyWidget extends AppWidgetProvider {

    final String LOG_TAG = "myLogs";

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
        Log.d(LOG_TAG, "onEnabled");
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
                         int[] appWidgetIds) {
        super.onUpdate(context, appWidgetManager, appWidgetIds);
        Log.d(LOG_TAG, "onUpdate " + Arrays.toString(appWidgetIds));
    }
}

当我第一次启动应用程序时,我看到日志输出:D/myLogs: onUpdate [8]

但是,如果我按下这个小部件后不会发生。我希望D/myLogs: onUpdate [8]再次打印,但事实并非如此。

答案

但是,如果我按下这个小部件后不会发生

正确。您的应用小部件没有用户界面,并且在该用户界面中您还没有设置一个触发PendingIntent(或其他任何)的onUpdate()

例如,这是一个AppWidgetProvider,它创建一个UI并使用PendingIntent来控制点击:

/***
  Copyright (c) 2008-2012 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  Covered in detail in the book _The Busy Coder's Guide to Android Development_
    https://commonsware.com/Android
*/

package com.commonsware.android.appwidget.dice;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;

public class AppWidget extends AppWidgetProvider {
  private static final int[] IMAGES={R.drawable.die_1,R.drawable.die_2,
                                      R.drawable.die_3,R.drawable.die_4,
                                      R.drawable.die_5,R.drawable.die_6};

  @Override
  public void onUpdate(Context ctxt, AppWidgetManager mgr,
                        int[] appWidgetIds) {
    ComponentName me=new ComponentName(ctxt, AppWidget.class);

    mgr.updateAppWidget(me, buildUpdate(ctxt, appWidgetIds));
  }

  private RemoteViews buildUpdate(Context ctxt, int[] appWidgetIds) {
    RemoteViews updateViews=new RemoteViews(ctxt.getPackageName(),
                                            R.layout.widget);

    Intent i=new Intent(ctxt, AppWidget.class);

    i.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);

    PendingIntent pi=PendingIntent.getBroadcast(ctxt, 0 , i,
                                                PendingIntent.FLAG_UPDATE_CURRENT);

    updateViews.setImageViewResource(R.id.left_die,
                                     IMAGES[(int)(Math.random()*6)]); 
    updateViews.setOnClickPendingIntent(R.id.left_die, pi);
    updateViews.setImageViewResource(R.id.right_die,
                                     IMAGES[(int)(Math.random()*6)]); 
    updateViews.setOnClickPendingIntent(R.id.right_die, pi);
    updateViews.setOnClickPendingIntent(R.id.background, pi);

    return updateViews;
  }
}

(来自this sample appthis book

我的onUpdate()方法调用了buildUpdate()方法。 buildUpdate()

  • 基于布局创建RemoteViews,以定义应用程序窗口小部件的基本UI
  • 识别要在该布局中的两个ImageView小部件中显示的图像(在这种情况下,六六个模具面的随机图像)
  • 创建一个Intent,它将调用用于触发我的onUpdate()调用的相同广播
  • 在广播Intent中包装PendingIntent
  • PendingIntent附加到UI以响应单击事件
  • 使用将RemoteViews配置为app小部件的UI

结果:当用户点击图像或背景时,使用AppWidgetProvider再次调用onUpdate(),并且用户看到更新的掷骰子。

以上是关于小部件onUpdate调用一次的主要内容,如果未能解决你的问题,请参考以下文章

从应用程序的主要活动中调用小部件的 onUpdate 方法

onUpdate 未在小部件中调用,即使我在 onreceive 中看到 android.appwidget.action.APPWIDGET_UPDATE 意图

OnUpdate 在 Android Widget 中的 onReceive 之前调用

从原生 Android 主屏幕小部件调用 Flutter (Dart) 代码

启动配置活动时调用Widget onUpdate

如何每秒刷新小部件?