一.AppWidgetManager
AppWidgetManager是在系統(tǒng)啟動時運行的單例對象。這意味著每個啟動器的每個實例都使用相同的AppWidgetManager之剧。他們的AppWidgetHost和他們目前持有的RemoteView有什么區(qū)別。 AppWidgetManager基本上保存所有活動主機及其持有的小部件的列表砍聊。 AppWidgetHost不是一個有限的對象背稼。也就是說,任何活動可能都有一個主機玻蝌。因此蟹肘,整個應用程序可能只是Widgets,如果他們這樣選擇俯树。
當您實例化主機時帘腹,您必須添加視圖。所以许饿,基本上它是一個沒有強制父母限制的子視圖列表竹椒,除了你的活動給它。首先米辐,你要求一個ID(通過myHost.allocateAppWidgetId())胸完。然后你使用你的選擇小部件活動/對話框。 Dialog返回WidgetInfo翘贮。當您要求主機通過WidgetInfo和您要求的ID創(chuàng)建View(通過createView)時赊窥,將檢索該視圖。然后狸页,它要求窗口小部件的RemoteView锨能。
最后扯再,通過將活動中的“視圖”作為子項來綁定小部件。這通過包含所有Widget的ViewGroup的addView()方法完成址遇。
首先熄阻,你必須確保你的Android清單中有這個:
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
接下來,你必須創(chuàng)建一個AppWidgetHost(我為我的發(fā)射器擴展自己)倔约。主機的關鍵是通過AppWidgetManager.getInstance();保持對AppWidgetManager的引用秃殉。
AppWidgetHost myHost = new AppWidgetHost(context, SOME_NUMERICAL_CONSTANT_AS_AN_ID);
現(xiàn)在,得到你的ID:
myHost.allocateAppWidgetId()
下一步是通過您用來獲取窗口小部件信息的任何方法完成的浸剩。大多數(shù)情況下钾军,它通過onActivityResult通過Intent返回。現(xiàn)在绢要,您所需要做的就是使用appInfo并創(chuàng)建視圖吏恭。 WidgetId通常由pick widget活動結(jié)果提供。
AppWidgetProviderInfo withWidgetInfo
= AppWidgetManager.getInstance().getAppWidgetInfo(forWidgetId);
AppWidgetHostView hostView
= myWidgetHost.createView(myContext, forWidgetId, withWidgetInfo);
hostView.setAppWidget(forWidgetId, withWidgetInfo);
現(xiàn)在你只需將View作為一個孩子綁定到你要綁定的任何東西重罪。
myViewGroup.addView(hostView);
當然樱哼,你總是要考慮在哪里和如何放置它等等。另外剿配,你必須確保你的AppWidgetHost在開始添加小部件之前正在偵聽唇礁。
myHost.startListening()
總結(jié)一下
Widget綁定過程跨越許多方法和步驟,但都通過AppWidgetHost發(fā)生惨篱。因為小部件是在您的命名空間之外編碼的,除了放置它們的位置以及視圖的大小之外围俘,您沒有任何控制權(quán)砸讳。由于最終代碼運行在您的空間,而是在您的控制之外界牡,AppWidgetManager充當中立的調(diào)解員簿寂,而AppWidgetHost代表您的應用程序的協(xié)調(diào)人。一旦了解宿亡,您的任務很簡單常遂。以上步驟是所有自定義啟動器(包括我自己的)所需的步驟。