小部件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;
}
}
我的onUpdate()
方法调用了buildUpdate()
方法。 buildUpdate()
:
- 基于布局创建
RemoteViews
,以定义应用程序窗口小部件的基本UI - 识别要在该布局中的两个
ImageView
小部件中显示的图像(在这种情况下,六六个模具面的随机图像) - 创建一个
Intent
,它将调用用于触发我的onUpdate()
调用的相同广播 - 在广播
Intent
中包装PendingIntent
- 将
PendingIntent
附加到UI以响应单击事件 - 使用将
RemoteViews
配置为app小部件的UI
结果:当用户点击图像或背景时,使用AppWidgetProvider
再次调用onUpdate()
,并且用户看到更新的掷骰子。
以上是关于小部件onUpdate调用一次的主要内容,如果未能解决你的问题,请参考以下文章
onUpdate 未在小部件中调用,即使我在 onreceive 中看到 android.appwidget.action.APPWIDGET_UPDATE 意图
OnUpdate 在 Android Widget 中的 onReceive 之前调用