一.AppWidgetManager
AppWidgetManager是在系统启动时运行的单例对象。这意味着每个启动器的每个实例都使用相同的AppWidgetManager。他们的AppWidgetHost和他们目前持有的RemoteView有什么区别。 AppWidgetManager基本上保存所有活动主机及其持有的小部件的列表。 AppWidgetHost不是一个有限的对象。也就是说,任何活动可能都有一个主机。因此,整个应用程序可能只是Widgets,如果他们这样选择。
当您实例化主机时,您必须添加视图。所以,基本上它是一个没有强制父母限制的子视图列表,除了你的活动给它。首先,你要求一个ID(通过myHost.allocateAppWidgetId())。然后你使用你的选择小部件活动/对话框。 Dialog返回WidgetInfo。当您要求主机通过WidgetInfo和您要求的ID创建View(通过createView)时,将检索该视图。然后,它要求窗口小部件的RemoteView。
最后,通过将活动中的“视图”作为子项来绑定小部件。这通过包含所有Widget的ViewGroup的addView()方法完成。
首先,你必须确保你的Android清单中有这个:
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
接下来,你必须创建一个AppWidgetHost(我为我的发射器扩展自己)。主机的关键是通过AppWidgetManager.getInstance();保持对AppWidgetManager的引用。
AppWidgetHost myHost = new AppWidgetHost(context, SOME_NUMERICAL_CONSTANT_AS_AN_ID);
现在,得到你的ID:
myHost.allocateAppWidgetId()
下一步是通过您用来获取窗口小部件信息的任何方法完成的。大多数情况下,它通过onActivityResult通过Intent返回。现在,您所需要做的就是使用appInfo并创建视图。 WidgetId通常由pick widget活动结果提供。
AppWidgetProviderInfo withWidgetInfo
= AppWidgetManager.getInstance().getAppWidgetInfo(forWidgetId);
AppWidgetHostView hostView
= myWidgetHost.createView(myContext, forWidgetId, withWidgetInfo);
hostView.setAppWidget(forWidgetId, withWidgetInfo);
现在你只需将View作为一个孩子绑定到你要绑定的任何东西。
myViewGroup.addView(hostView);
当然,你总是要考虑在哪里和如何放置它等等。另外,你必须确保你的AppWidgetHost在开始添加小部件之前正在侦听。
myHost.startListening()
总结一下
Widget绑定过程跨越许多方法和步骤,但都通过AppWidgetHost发生。因为小部件是在您的命名空间之外编码的,除了放置它们的位置以及视图的大小之外,您没有任何控制权。由于最终代码运行在您的空间,而是在您的控制之外,AppWidgetManager充当中立的调解员,而AppWidgetHost代表您的应用程序的协调人。一旦了解,您的任务很简单。以上步骤是所有自定义启动器(包括我自己的)所需的步骤。
网友评论