如何解决Android Widget 的生命周期是什么?
这是关于 Android Activity 生命周期的很好的文档,但我找不到任何关于 Widget 生命周期的文档。文档讨论了用于 onUpdate、onEnabled、onDeleted、onAppWidgetoptionsChanged 等的 appwidgetprovider 广播消息。
小部件在重新启动之间持续存在,并且在 AppWidgetHost 应用程序重新启动和 appwidgetprovider 重新启动之间保持不变,因此了解生命周期很重要。
所以,据我所知,这是生命周期:
-
Launcher(AppWidgetHost) 希望添加小部件
-
启动器向 AppWidgetManager 询问 appwidgetproviders 的列表
-
用户选择的小部件并将其放置在启动器“主页”上
-
Launcher 将小部件的主页位置和持久的 widgetId 存储在 DB 中
-
AppWidgetManager 调用 appwidgetprovider '配置活动'(如果有)
- 配置活动创建 RemoteViews() 并调用 widgMgr.updateAppWidget(widgId,views)
-
?? appwidgetprovider 是否需要持久存储 widgetId 和关联的配置信息?
-
在重新启动、或启动器重新启动、或重新启动/重新安装 appwidgetprovider 时,AppWidgetManager 会为每个 widgetId 调用 .onUpdate -- 也许是为了重新创建与小部件关联的 RemoteView?
-
- Launcher(AppWidgetHost) 删除关于 widgetId 的持久信息
- AppWidgetManager 发送 APPWIDGET_DELETE 广播,appwidgetprovider .onDeleted 被调用
- appwidgetprovider 会删除有关该 widgetId 的持久信息吗?
Launcher(AppWidgetHost) 和 AppWidgetManager 以及 appwidgetprovider 必须维护与 widgetId 相关联的持久信息,这一事实使得了解小部件的生命周期从创建到启用、禁用、恢复、重新启动,再到各种包很重要正在重新安装,删除。
在这个 other widget lifecycle question 中没有找到生命周期。 @CommmonsWare(我认为)指出 appwidgetprovider 的各种对象即使在广播消息之间也不稳定,例如 onUpdate 等(我认为 appwidgetprovider 可能只是一个 broadcastReceiver 而不一定是静态变量或实例变量将坚持一点。
AppWidgetManager 持久性小部件数据库
对于那些搜索信息的人:
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:
appwidgetprovider 广播接收器
(正如@CommonsWare 指出的...)appwidgetprovider 扩展了 broadcastReceiver,因此您的小部件类的主界面正在通过其 onReceive(Context,Intent) 方法发送广播意图。您的小部件包可能不是 Android 应用程序或包含 Android 活动,因此应用程序和活动的持久性和生命周期不适用。
因此,您不能将信息存储在小部件类的静态变量或实例变量中,因为它们可能不会在小部件实例的持续时间内继续存在。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。