首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止onUpdate of WidgetProvider的触发

防止onUpdate of WidgetProvider的触发
EN

Stack Overflow用户
提问于 2012-08-02 16:01:13
回答 3查看 1.5K关注 0票数 5

我正在实现一个具有ConfigurationActivity的Widget,它必须与Eclair(2.1)兼容。

文档 about AppWidgetProviders onUpdate方法明确指出:

. .However,如果您声明了配置活动,则在用户添加App时不调用此方法,而是为后续更新调用该方法。在完成配置时执行第一次更新是配置活动的责任。(请参见创建下面的App配置活动。)

不幸的是,这不是真的(至少对于我使用JellyBean的Nexus来说是这样)。实际上,onUpdate触发器的 onCreate之前被称为ConfigurationActivity。我想知道,在其他手机上是否有类似的行为,以及是否有可能阻止我的提供商内部的onUpdate呼叫?

我的解决办法是在SharedPreferences中使用特定的AppWidgetId在WidgetConfigurationActivity中存储一个标志。如果没有,我可以假设ConfigurationActivity不是首先被调用的。这是可行的,但在我看来真的很难看。如果我不能阻止onUpdate触发,还有更好的解决方案吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-05 19:02:00

是的,当您在主屏幕上添加一个小部件时,会调用onUpdate()。见这里:

http://developer.android.com/reference/android/appwidget/AppWidgetProvider.html

更新

我不确定在创建小部件时是否有一种不触发它的方法。但是,您可以通过将Widget文件中的"updatePeriodMillis“字段设置为或只留下空白来阻止它再次触发。

另一种方法是将小部件ID存储在某个地方。现在,每当添加一个新小部件时,在接收类中,检查ID是否已经存在。如果它不存在(意思是一个新的小部件),那么不要执行任何代码。此外,每当小部件被删除时,从记录中删除小部件ID。因为您可能删除了一个小部件,所以稍后添加了一个与旧部件具有相同ID的新小部件。

希望这能帮上忙!

编辑:在接收类中的onReceive()方法中,执行以下操作:

代码语言:javascript
复制
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

    int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
    if( appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID )
    {
        super.onReceive(context, intent);
    }

}

当第一次从小部件列表中选择一个小部件时,它的appWidgetId将等于INVALID_APPWIDGET_ID,直到它被添加到主屏幕上。由于"super.onReceive()“在选择小部件时调用onUpdate()方法,因此onUpdate()将不会第一次被调用。

票数 4
EN

Stack Overflow用户

发布于 2014-04-09 07:00:00

我也有这个错误。

甚至我也将updatePeriodMillis设置为0。在启动Widget活动配置之前,我的onUpdate正在运行。我认为这是android小部件中的一个bug。

票数 0
EN

Stack Overflow用户

发布于 2016-07-20 15:55:46

我解决了这个问题,向onUpdate中的意图添加了一个操作,然后创建一个if检查onReceive,以查看是否单击了小部件:

我添加了intentClick.setAction(WIDGET_CLICKED);,它只在单击小部件时触发。

代码语言:javascript
复制
public class WidgetProvider extends AppWidgetProvider {

    private static final String TAG = WidgetProvider.class.getSimpleName();
    private static String WIDGET_CLICKED = "widget_clicked";

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Log.e(TAG, "onUpdate()");

    remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
    watchWidget = new ComponentName(context, WidgetProvider.class);

    Intent intentClick = new Intent(context, WidgetProvider.class);
    intentClick.setAction(WIDGET_CLICKED);
    intentClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, "" + appWidgetIds[0]);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetIds[0], intentClick, 0);
    remoteViews.setOnClickPendingIntent(R.id.img_btn, pendingIntent);
    remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.play);

    appWidgetManager.updateAppWidget(watchWidget, remoteViews);
}

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

    Log.e(TAG, "onReceive()");
    Bundle extras = intent.getExtras();

    //If AND ONLY IF WIDGET_CLICKED
    if (extras != null && intent.getAction().equals(WIDGET_CLICKED)) {
        remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);

        //If isPlaying
        if (isPlaying) {
            //setBackground as PLAY
            remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.play);
            isPlaying = false;

            Intent i = new Intent(context, MediaPlayerService.class);
            i.putExtra("command", "stopSong");
            context.startService(i);

            //If NOT playing
        } else {
            //setBackground as STOP
            remoteViews.setInt(R.id.img_btn, "setBackgroundResource", R.drawable.stop);
            isPlaying = true;

            Intent i = new Intent(context, MediaPlayerService.class);
            i.putExtra("command", "playRandomSong");
            context.startService(i);
        }

        watchWidget = new ComponentName(context, WidgetProvider.class);

        (AppWidgetManager.getInstance(context)).updateAppWidget(watchWidget, remoteViews);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11781415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档