这是关于 Android Activity 生命周期的很好的文档,但我找不到任何关于 Widget 生命周期的文档。文档讨论了用于 onUpdate、onEnabled、onDeleted、onAppWidgetOptionsChanged 等的 AppWidgetProvider 广播消息。
小部件在重新启动之间持续存在,并且在 AppWidgetHost 应用程序重新启动和 AppWidgetProvider 重新启动之间保持不变,因此了解生命周期很重要。
所以,据我所知,这是生命周期:
Launcher(AppWidgetHost) 希望添加小部件
启动器向 AppWidgetManager 询问 AppWidgetProviders 的列表
AppWidgetManager 创建小部件实例,并在其秘密数据库中为 widgetId 分配一个商店
用户选择的小部件并将其放置在启动器“主页”上
Launcher 将小部件的主页位置和持久的 widgetId 存储在 DB 中
AppWidgetManager 调用 AppWidgetProvider '配置活动'(如果有)
?? AppWidgetProvider 是否需要持久存储 widgetId 和关联的配置信息?
在重新启动、或启动器重新启动、或重新启动/重新安装 AppWidgetProvider 时,AppWidgetManager 会为每个 widgetId 调用 .onUpdate -- 也许是为了重新创建与小部件关联的 RemoteView?
... 某个用户可能会删除小部件
Launcher(AppWidgetHost) 和 AppWidgetManager 以及 AppWidgetProvider 必须维护与 widgetId 相关联的持久信息,这一事实使得了解小部件的生命周期从创建到启用、禁用、恢复、重新启动,再到各种包很重要正在重新安装,删除。
在这个 other widget lifecycle question 中没有找到生命周期。 @CommmonsWare(我认为)指出 AppWidgetProvider 的各种对象即使在广播消息之间也不稳定,例如 onUpdate 等(我认为 AppWidgetProvider 可能只是一个 BroadcastReceiver 而不一定是静态变量或实例变量将坚持一点。
对于那些搜索信息的人:
AppWidgetManager 似乎将有关现有小部件实例、提供程序和主机的信息保存在:
/data/system/users/0 # cat appwidgets.xml
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<gs>
<p pkg="revive.rwidg" cl="revive.rwidg.RWidg" />
<h pkg="com.teslacoilsw.launcher" id="400" />
<g id="1" h="0" min_width="0" min_height="0" max_width="0" max_height="0" host_category="0" />
<g id="2" h="0" min_width="0" min_height="0" max_width="0" max_height="0" host_category="0" />
<g id="3" h="0" min_width="0" min_height="0" max_width="0" max_height="0" host_category="0" />
<g id="2b" h="0" p="0" min_width="5a" min_height="42" max_width="85" max_height="65" host_category="1" />
<g id="2e" h="0" p="0" min_width="5a" min_height="42" max_width="85" max_height="65" host_category="1" />
<b packageName="com.teslacoilsw.launcher" />
</gs>
有关小部件、主机和提供程序的当前信息可通过 (linux, adb, shell) 命令获得:
dumpsys appwidget
User: 0
Providers:
[0] provider com.android.contacts/.socialwidget.SocialWidgetProvider:
min=(66561x10241) minResize=(66561x10241) updatePeriodMillis=86400000 resizeMode=01 autoAdvanceViewId=-1 initialLayout=#7f04008a uid=10000 zombie=false
[1] provider com.android.email/.provider.WidgetProvider:
min=(46081x28161) minResize=(46081x28161) updatePeriodMillis=0 resizeMode=33 autoAdvanceViewId=-1 initialLayout=#7f040045 uid=10009 zombie=false
[2] provider com.android.settings/.widget.SettingsAppWidgetProvider:
min=(66561x10241) minResize=(66561x10241) updatePeriodMillis=0 resizeMode=01 autoAdvanceViewId=-1 initialLayout=#7f040085 uid=1000 zombie=false
[3] provider revive.rwidg/.RWidg:
min=(12801x12801) minResize=(12801x12801) updatePeriodMillis=30000 resizeMode=01 autoAdvanceViewId=-1 initialLayout=#7f090023 uid=10040 zombie=false
AppWidgetIds:
[0] id=1
hostId=1024 com.teslacoilsw.launcher/10033
host.callbacks=com.android.internal.appwidget.IAppWidgetHost$Stub$Proxy@41d4d2c8
[1] id=2
hostId=1024 com.teslacoilsw.launcher/10033
host.callbacks=com.android.internal.appwidget.IAppWidgetHost$Stub$Proxy@41d4d2c8
[2] id=3
hostId=1024 com.teslacoilsw.launcher/10033
host.callbacks=com.android.internal.appwidget.IAppWidgetHost$Stub$Proxy@41d4d2c8
[3] id=43
hostId=1024 com.teslacoilsw.launcher/10033
provider=revive.rwidg/.RWidg
host.callbacks=com.android.internal.appwidget.IAppWidgetHost$Stub$Proxy@41d4d2c8
[4] id=46
hostId=1024 com.teslacoilsw.launcher/10033
provider=revive.rwidg/.RWidg
host.callbacks=com.android.internal.appwidget.IAppWidgetHost$Stub$Proxy@41d4d2c8
Hosts:
[0] hostId=1024 com.teslacoilsw.launcher/10033:
callbacks=com.android.internal.appwidget.IAppWidgetHost$Stub$Proxy@41d4d2c8
instances.size=5 zombie=false
Deleted Providers:
Deleted Hosts:
(正如@CommonsWare 指出的...)AppWidgetProvider 扩展了 BroadcastReceiver,因此您的小部件类的主界面正在通过其 onReceive(Context, Intent) 方法发送广播意图。您的小部件包可能不是 Android 应用程序或包含 Android 活动,因此应用程序和活动的持久性和生命周期不适用。
因此,您不能将信息存储在小部件类的静态变量或实例变量中,因为它们可能不会在小部件实例的持续时间内继续存在。