一.AppWidgetManager
AppWidgetManager是在系統(tǒng)啟動(dòng)時(shí)運(yùn)行的單例對(duì)象。這意味著每個(gè)啟動(dòng)器的每個(gè)實(shí)例都使用相同的AppWidgetManager。他們的AppWidgetHost和他們目前持有的RemoteView有什么區(qū)別。 AppWidgetManager基本上保存所有活動(dòng)主機(jī)及其持有的小部件的列表。 AppWidgetHost不是一個(gè)有限的對(duì)象。也就是說(shuō),任何活動(dòng)可能都有一個(gè)主機(jī)。因此,整個(gè)應(yīng)用程序可能只是Widgets,如果他們這樣選擇。
當(dāng)您實(shí)例化主機(jī)時(shí),您必須添加視圖。所以,基本上它是一個(gè)沒(méi)有強(qiáng)制父母限制的子視圖列表,除了你的活動(dòng)給它。首先,你要求一個(gè)ID(通過(guò)myHost.allocateAppWidgetId())。然后你使用你的選擇小部件活動(dòng)/對(duì)話框。 Dialog返回WidgetInfo。當(dāng)您要求主機(jī)通過(guò)WidgetInfo和您要求的ID創(chuàng)建View(通過(guò)createView)時(shí),將檢索該視圖。然后,它要求窗口小部件的RemoteView。
最后,通過(guò)將活動(dòng)中的“視圖”作為子項(xiàng)來(lái)綁定小部件。這通過(guò)包含所有Widget的ViewGroup的addView()方法完成。
首先,你必須確保你的Android清單中有這個(gè):
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
接下來(lái),你必須創(chuàng)建一個(gè)AppWidgetHost(我為我的發(fā)射器擴(kuò)展自己)。主機(jī)的關(guān)鍵是通過(guò)AppWidgetManager.getInstance();保持對(duì)AppWidgetManager的引用。
AppWidgetHost myHost = new AppWidgetHost(context, SOME_NUMERICAL_CONSTANT_AS_AN_ID);
現(xiàn)在,得到你的ID:
myHost.allocateAppWidgetId()
下一步是通過(guò)您用來(lái)獲取窗口小部件信息的任何方法完成的。大多數(shù)情況下,它通過(guò)onActivityResult通過(guò)Intent返回?,F(xiàn)在,您所需要做的就是使用appInfo并創(chuàng)建視圖。 WidgetId通常由pick widget活動(dòng)結(jié)果提供。
AppWidgetProviderInfo withWidgetInfo
= AppWidgetManager.getInstance().getAppWidgetInfo(forWidgetId);
AppWidgetHostView hostView
= myWidgetHost.createView(myContext, forWidgetId, withWidgetInfo);
hostView.setAppWidget(forWidgetId, withWidgetInfo);
現(xiàn)在你只需將View作為一個(gè)孩子綁定到你要綁定的任何東西。
myViewGroup.addView(hostView);
當(dāng)然,你總是要考慮在哪里和如何放置它等等。另外,你必須確保你的AppWidgetHost在開始添加小部件之前正在偵聽(tīng)。
myHost.startListening()
總結(jié)一下
Widget綁定過(guò)程跨越許多方法和步驟,但都通過(guò)AppWidgetHost發(fā)生。因?yàn)樾〔考窃谀拿臻g之外編碼的,除了放置它們的位置以及視圖的大小之外,您沒(méi)有任何控制權(quán)。由于最終代碼運(yùn)行在您的空間,而是在您的控制之外,AppWidgetManager充當(dāng)中立的調(diào)解員,而AppWidgetHost代表您的應(yīng)用程序的協(xié)調(diào)人。一旦了解,您的任務(wù)很簡(jiǎn)單。以上步驟是所有自定義啟動(dòng)器(包括我自己的)所需的步驟。