从窗口小部件启动活动有时会失败

时间:2011-02-03 20:36:06

标签: android android-activity launch android-appwidget homescreen

我已经实现了一个App Widget来点击时启动我的活动。

onUpdate()

WidgetProvider方法:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);

    final int N = appWidgetIds.length;
    for (int i=0; i<N; i++) {
        int appWidgetId = appWidgetIds[i];

        RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidgetprovider_layout);
        // ....update updateViews here
        appWidgetManager.updateAppWidget(appWidgetId, updateViews);

        Intent onClickedIntent = new Intent(context,MyActivity.class);
        PendingIntent pi = PendingIntent.getActivity(context, 0, onClickedIntent, 0);
        updateViews.setOnClickPendingIntent(R.id.myView, pi);

        appWidgetManager.updateAppWidget(appWidgetId, updateViews);

     }
}

在主屏幕上添加小部件后,它按预期工作。

但有时候,它无法再次启动活动!我必须删除小部件并再次添加。

我该如何解决?请帮忙。

2 个答案:

答案 0 :(得分:0)

我会这样做:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidgetprovider_layout);    
    Intent onClickedIntent = new Intent(context,MyActivity.class);
    PendingIntent pi = PendingIntent.getActivity(context, 0, onClickedIntent, 0);
    updateViews.setOnClickPendingIntent(R.id.myView, pi);

    for (int i=0; i<appWidgetIds.length; i++) {
        appWidgetManager.updateAppWidget(appWidgetIds[i], updateViews);
     }
}

我不确定的一件事就是致电super.onUpdate()。我自己的小部件代码没有它,似乎工作正常......不确定是否需要它。

我不知道这个重构会不会解决你的问题!

答案 1 :(得分:0)

我知道这已经晚了两年但我也一直在努力,直到今天我才知道自己做错了什么。我认为主要关键是要关注RemoteViews类的使用。您将这些对象准备为一种指令集,供另一个要遵循的流程使用。设置“on click pending intent”必须在发送到updateAppWidget方法之前完成,因此您对该方法的第一次调用不会使您的“myView”对象获得点击。您的代码接下来设置onClick触发器并再次调用updateAppWidget。它看起来应该可以工作但是有一个令人困惑的主题,关于两个意图何时是截然不同或含糊不清的,你可能想要阅读这些意图以理解为什么你的代码工作不可预测。如果我是对的,那么外卖就是不要第一次调用updateAppWidget,然后在创建RemoteViews对象时始终确保设置onClick触发器。无论如何,我希望如此。