Android Widget 的生命周期是什么?

时间:2021-06-15 16:35:47

标签: android android-widget android-lifecycle

这是关于 Android Activity 生命周期的很好​​的文档,但我找不到任何关于 Widget 生命周期的文档。文档讨论了用于 onUpdate、onEnabled、onDeleted、onAppWidgetOptionsChanged 等的 AppWidgetProvider 广播消息。

小部件在重新启动之间持续存在,并且在 AppWidgetHost 应用程序重新启动和 AppWidgetProvider 重新启动之间保持不变,因此了解生命周期很重要。

所以,据我所知,这是生命周期:

  • Launcher(AppWidgetHost) 希望添加小部件

  • 启动器向 AppWidgetManager 询问 AppWidgetProviders 的列表

  • AppWidgetManager 创建小部件实例,并在其秘密数据库中为 widgetId 分配一个商店

  • 用户选择的小部件并将其放置在启动器“主页”上

  • Launcher 将小部件的主页位置和持久的 widgetId 存储在 DB 中

  • AppWidgetManager 调用 AppWidgetProvider '配置活动'(如果有)

    • 配置活动创建 RemoteViews() 并调用 widgMgr.updateAppWidget(widgId, views)
  • ?? AppWidgetProvider 是否需要持久存储 widgetId 和关联的配置信息?

  • 在重新启动、或启动器重新启动、或重新启动/重新安装 AppWidgetProvider 时,AppWidgetManager 会为每个 widgetId 调用 .onUpdate -- 也许是为了重新创建与小部件关联的 RemoteView?

  • ... 某个用户可能会删除小部件

    • Lau​​ncher(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 活动,因此应用程序和活动的持久性和生命周期不适用。

因此,您不能将信息存储在小部件类的静态变量或实例变量中,因为它们可能不会在小部件实例的持续时间内继续存在。

0 个答案:

没有答案
相关问题