为何AppWidget不支持自定义View?
几个大类RemoveViews, RemoveViewsService, RemoveViewsFactory就不说了。不是本节主题。
切入正题,直接从AppWidgetHostView.java开始讲。这就相当于Activity的DecorView。
贴一段代码先,来自AppWidgetHostView.java版本:5.1
/**
* Inflate and return the default layout requested by AppWidget provider.
*/
protected View getDefaultView() {
......
try {
if (mInfo != null) {
Context theirContext = getRemoteContext();
mRemoteContext= theirContext;
LayoutInflater inflater = (LayoutInflater)
theirContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater = inflater.cloneInContext(theirContext);
inflater.setFilter(sInflaterFilter);
AppWidgetManager manager = AppWidgetManager.getInstance(mContext);
Bundle options = manager.getAppWidgetOptions(mAppWidgetId);
int layoutId = mInfo.initialLayout;
......
defaultView = inflater.inflate(layoutId, this, false);
} else {
Log.w(TAG, "can't inflate defaultView because mInfo is missing");
}
} catch (RuntimeException e) {
exception = e;
}
......
return defaultView;
}
再看下面这段代码sInflaterFilter的定义
// When we're inflating the initialLayout for a AppWidget, we only allow
// views that are allowed in RemoteViews.
static final LayoutInflater.Filter sInflaterFilter = new LayoutInflater.Filter() {
public boolean onLoadClass(Class clazz) {
return clazz.isAnnotationPresent(RemoteViews.RemoteView.class);
}
};
再贴一段getRemoteContext()的实现