在不破坏现有小部件的情况下重命名 AppWidgetProvider

Rename AppWidgetProvider without breaking existing widgets

我最近发现,在我重命名扩展 AppWidgetProvider 的 class(作为代码整理的一部分)并安装修改后的应用程序后,现有的小部件会损坏,只显示 "Problem loading widget"。

将新的小部件添加到主屏幕效果很好,只是现有的小部件会损坏。虽然作为开发人员,我不介意删除现有的小部件并添加一个新的小部件,但我的应用程序的用户不会愿意这样做,因为每个小部件都需要时间来重新配置。

那么,有没有一种方法可以在不破坏现有小部件的情况下安全地重命名 AppWidgetProvider class?我当然可以保留这个名字,但它让我感到不安,我永远坚持这个名字(事后看来有点令人困惑)。

不幸的是,没有办法修复它。问题出在更改的 ComponentName 中。 AppWidgetHost 只是试图从 AppWidgetManager 获取您的小部件,而 AppWidgetManager 试图通过 ComponentName,所以你改包名后AppWidgetProviderAppWidgetHost无法恢复你之前的widgets,因为他已保存 old ComponentName。因此,正如您所见,无法更改 AppWidgetProvider 的包名称。