gpt4 book ai didi

android - 在没有 bindAppWidgetId() 的情况下将小部件添加到启动器页面

转载 作者:IT王子 更新时间:2023-10-28 23:30:39 25 4
gpt4 key购买 nike

我正在尝试将库存 ICS 启动器变成一个独立的应用程序。我快到了 - 唯一不起作用的是搜索图标和将小部件放到屏幕上,这会导致崩溃。

崩溃是因为股票启动器使用 appWidgetManager.bindAppWidgetId(appWidgetId, componentName); 添加小部件,apparently only system apps have permission to do .

所以我的问题是,非系统应用添加小部件并获得与普通 ICS 启动器相同的 UI 体验的正确方法是什么

最佳答案

提姆,

您的问题是您正在寻找错误的对象。您无法真正控制 AppWidgetManager。这不是你的工作,是系统的。你可以做的是控制一个AppWidgetHost,它只需要一些语义。以下是基础知识。

编辑:小部件绑定(bind)过程的额外背景

AppWidgetManager 是一个在系统启动时运行的单例对象。这意味着每个启动器的每个实例都使用相同的 AppWidgetManager。他们的区别在于他们的 AppWidgetHost 和他们当前持有的 RemoteViews。 AppWidgetManager 基本上保留了所有 Activity 主机和它们持有的小部件的列表。 AppWidgetHost 不是特权对象。也就是说,任何 Activity 都可能有一个主机。因此,如果他们愿意,整个应用程序可能只是 Widgets。

当您实例化主机时,您必须向其添加 View 。所以,基本上它是一个没有强制性 parent 界限的 subview 列表,除了你的 Activity 给它的。首先,您需要一个 ID(通过 myHost.allocateAppWidgetId())。然后你使用你的 Pick Widget Activity/Dialog。对话框返回 WidgetInfo。当您要求主机使用 WidgetInfo 和您要求的 ID 创建 View (通过 createView)时,将检索 View 。然后它向小部件询问其 RemoteView

最后,通过将 View 作为 Child 放置在 Activity 中来绑定(bind)小部件。这是通过包含所有小部件的 ViewGroup 的 addView() 方法完成的。

行动过程(已编辑)

首先,你必须确保你的 android manifest 中有这个:

<uses-permission android:name="android.permission.BIND_APPWIDGET" />

接下来,您必须创建一个 AppWidgetHost(我为自己的启动器扩展了自己的)。 Host 的关键是通过 AppWidgetManager.getInstance(); 保持对 AppWidgetManager 的引用。

AppWidgetHost myHost = new AppWidgetHost(context, SOME_NUMERICAL_CONSTANT_AS_AN_ID);

现在,获取您的 ID:

myHost.allocateAppWidgetId()

下一步是通过您用于获取小部件信息的任何方法完成的。大多数情况下,它是通过 onActivityResult 通过 Intent 返回的。现在,您真正需要做的就是使用 appInfo 并创建 View 。 WidgetId 通常由选择小部件 Activity 结果提供。

AppWidgetProviderInfo withWidgetInfo 
= AppWidgetManager.getInstance().getAppWidgetInfo(forWidgetId);
AppWidgetHostView hostView
= myWidgetHost.createView(myContext, forWidgetId, withWidgetInfo);
hostView.setAppWidget(forWidgetId, withWidgetInfo);

现在您只需将 View 作为子项绑定(bind)到您想要绑定(bind)的任何内容。

myViewGroup.addView(hostView);

当然,您必须始终考虑放置它的位置和方式等。此外,在开始添加小部件之前,您必须确保您的 AppWidgetHost 正在监听。

myHost.startListening()

总结

Widget 绑定(bind)过程跨越许多方法和步骤,但都是通过 AppWidgetHost 发生的。因为小部件是在您的命名空间之外编码的,所以除了放置它们的位置和 View 大小的方式之外,您没有任何控制权。由于它们最终是在您的空间中运行但不受您控制的代码,因此 AppWidgetManager 充当 neutral 中介,而 AppWidgetHost 充当代表您的应用程序的促进者。一旦理解了这一点,您的任务就很简单了。以上步骤是任何自定义启动器(包括我自己的)所需的所有步骤。

编辑:最终澄清

ICS Launcher 也可以执行此操作。他们使用的 appWidgetManager 只是一个封装 AppWidgetHost 和对 AppWidgetManager 的调用的包装器。我忘记了在 Android Development Central 网站上对此的解释很少。

希望这会有所帮助!如果您需要更多详细信息,请告诉我。

模糊逻辑

关于android - 在没有 bindAppWidgetId() 的情况下将小部件添加到启动器页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9746173/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com