【问题标题】:Launching activity from widget fail after sometimes从小部件启动活动有时会失败
【发布时间】:2011-02-03 20:36:06
【问题描述】:

我已经实现了一个 App Widget 以在单击时启动我的活动。

WidgetProvideronUpdate()方法:

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

     }
}

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

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

我该如何解决?请帮忙。

【问题讨论】:

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


    【解决方案1】:

    我会这样做:

    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()。我自己的小部件代码没有它,但似乎工作正常......不确定是否需要它。

    我不知道这个重构是否能解决你的问题!

    【讨论】:

    • 谢谢 dave.c,这对我来说似乎没问题。我认为重点是将 updateViews.setOnClickPendingIntent() 的代码移到 for 循环之外。
    • 还是有问题:( Nexus One 更新 2.3.3 后变得更严重了!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-07-02
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多