如何在安卓系统重启后重新启动和更新小部件

6
我有一个成功运行的小部件。现在,当手机重新启动时,小部件会丢失所有数据,并停留在主屏幕上。由于我无法在手机重新启动时从广播接收器更新小部件,因此我创建了一条通知,导向小部件的配置活动。在用户再次设置配置并离开配置活动后,什么都不起作用;空闲的小部件仍然保留在那里(用户必须删除小部件并再次创建小部件)。我认为我没有正确地接收小部件ID或者我在广播接收器中做错了,可能应该将所有代码移动到小部件方法中的onEnable? 我该如何正确刷新小部件?请记住,所有小部件更新都是从服务中完成的。
另外,我在广播接收器中对boot_completed操作有以下代码:
public void onReceive(final Context context, Intent intent) {

        String  info = context.getResources().getString(R.string.restart_setting);

     int[] allids = AppWidgetManager.getInstance(context).getAppWidgetIds(new ComponentName(context, MyWidgetProvider.class));
        for(int appWidgetId:allids){

        NotificationManager mnotifyManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notify = new Notification(R.drawable.icon, "Weather Update", System.currentTimeMillis());
        notify.defaults = Notification.DEFAULT_SOUND;
        notify.defaults = Notification.DEFAULT_VIBRATE;

    Intent Settings = new Intent(context, WidgetConfigure.class);
    Settings.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);

        PendingIntent pending = PendingIntent.getActivity(context, 0, weatherSettings, PendingIntent.FLAG_ONE_SHOT);
        notify.setLatestEventInfo(context, "Weather Update", info, pending);
        notify.flags = Notification.FLAG_AUTO_CANCEL;
        notify.defaults = Notification.DEFAULT_ALL;
        mnotifyManager.notify(WEATHER_NOTIFICATION_ID , notify);
        }
    }   

我最近尝试将这段代码移动到小部件周期中的onEnabled(),但它仍然无法刷新小部件。这真的可能吗? - irobotxx
如果AppWidgetProvider本身包含onReceive方法,为什么要使用单独的广播? - Shakeeb Ayaz
最好使用AppWidgetProvider的onReceive方法来处理小部件的ID和其他组件,以便更轻松地进行操作。 - Shakeeb Ayaz
1个回答

8

今天早上我遇到了同样的问题,并尝试通过监听 boot_completion 意图来解决它。但是这种方式在小部件中无效。以下是我找到的解决办法。

  • 要接收关于重启的通知,除了需要 boot_completed 意图和 android.permission.RECEIVE_BOOT_COMPLETED 权限之外,还需要接收 android.intent.action.ACTION_EXTERNAL_APPLICATION_AVAILABLE 。

  • 但实际上,不需要额外的意图。在重新启动后, BroadcastReceiver 的 onEnable 和 onUpadate 方法会被调用。

因此,我实现的解决方案是,在一个文件中存储每个小部件的配置,其中小部件 Id 作为文件名的一部分。在接收器的 onUpdate 方法中,我再次初始化小部件(包括单击侦听器等)。

结果是,在重新启动后,需要一段时间,但然后小部件(全部)看起来很好,并且按预期工作。


正是我所做的方法。 - Richard Le Mesurier
2
好事需要时间 :-) - jboi
这个解决方案是否已经足够,还需要做其他的事情吗? - Shreyash Mahajan
实际的解决方案从句子“So, the solution I've implemented...”开始实现。很抱歉我先描述了不起作用的部分。 - jboi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接