上篇讲到了Launcher中自定义了两个类:
LauncherAppWidgetHostView: 扩展了AppWidgetHostView,实现了对长按事件的处理
LauncherAppWidgetHost: 扩展了AppWidgetHost,这里只是重载了onCreateView,创建LauncherAppWidgetHostView的实例
24 /**
25 * Specific {@link AppWidgetHost} that creates our {@link LauncherAppWidgetHostView}
26 * which correctly captures all long-press events. This ensures that users can
27 * always pick up and move widgets.
28 */
29 public class LauncherAppWidgetHost extends AppWidgetHost {
30 public LauncherAppWidgetHost(Context context, int hostId) {
31 super(context, hostId);
32 }
34 @Override
35 protected AppWidgetHostView onCreateView(Context context, int appWidgetId,
36 AppWidgetProviderInfo appWidget) {
37 return new LauncherAppWidgetHostView(context);
38 }
39 }
首先在Launcher.java中定义了如下两个变量
174 private AppWidgetManager mAppWidgetManager;
175 private LauncherAppWidgetHost mAppWidgetHost;
在onCreate函数中初始化,
224 mAppWidgetManager = AppWidgetManager.getInstance(this);
225 mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);
226 mAppWidgetHost.startListening();
上述代码,获取mAppWidgetManager的实例,并创建LauncherAppWidgetHost,以及监听
197 static WeakHashMap<Context, WeakReference<AppWidgetManager>> sManagerCache = new WeakHashMap();
198 static IAppWidgetService sService;
204 /**
205 * Get the AppWidgetManager instance to use for the supplied {@link android.content.Context
206 * Context} object.
207 */
208 public static AppWidgetManager getInstance(Context context) {
209 synchronized (sManagerCache) {
210 if (sService == null) {
211 IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
212 sService = IAppWidgetService.Stub.asInterface(b);
213 }
215 WeakReference<AppWidgetManager> ref = sManagerCache.get(context);
216 AppWidgetManager result = null;
217 if (ref != null) {
218 result = ref.get();
219 }
220 if (result == null) {
221 result = new AppWidgetManager(context);
222 sManagerCache.put(context, new WeakReference(result));
223 }
224 return result;
225 }
226 }
228 private AppWidgetManager(Context context) {
229 mContext = context;
230 mDisplayMetrics = context.getResources().getDisplayMetrics();
231 }
以上代码是设计模式中标准的单例模式
frameworks/base/ core / java / android / appwidget / AppWidgetHost.java
90 public AppWidgetHost(Context context, int hostId) {
91 mContext = context;
92 mHostId = hostId;
93 mHandler = new UpdateHandler(context.getMainLooper());
94 synchronized (sServiceLock) {
95 if (sService == null) {
96 IBinder b = ServiceManager.getService(Context.APPWIDGET_SERVICE);
97 sService = IAppWidgetService.Stub.asInterface(b);
98 }
99 }
100 }
可以看到AppWidgetHost有自己的HostId,Handler,和sService
93 mHandler = new UpdateHandler(context.getMainLooper());
这是啥用法呢?
参数为Looper,即消息处理放到此Looper的MessageQueue中,有哪些消息呢?
40 static final int HANDLE_UPDATE = 1;
41 static final int HANDLE_PROVIDER_CHANGED = 2;
49 class Callbacks extends IAppWidgetHost.Stub {
50 public void updateAppWidget(int appWidgetId, RemoteViews views) {
51 Message msg = mHandler.obtainMessage(HANDLE_UPDATE);
52 msg.arg1 = appWidgetId;
53 msg.obj = views;