Tip
沿用Google 官网的一段话:
It is never used directly. Instead, use getLayoutInflater()
orgetSystemService(Class)
to retrieve a standard LayoutInflater instance that is already hooked up to the current context and correctly configured for the device you are running on. For example:
LayoutInflater inflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
不要直接使用静态实例
然而对照源码我们发现 from 函数
public static LayoutInflater from(Context context) {
LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (LayoutInflater == null) {
throw new AssertionError("LayoutInflater not found.");
}
return LayoutInflater;
}
做的就是getsystemservice 的工作 是一个方便的方式
膨胀layout过程中使用到了xmlpullparaser 读取xml文件
关于页面自定义和progress相关解耦
这里需要了解到的是contextWrapper的一个函数 attachbaseContext
Activity 本身是一个Context 继承自 ContextWrapper
ContextWrapper 是 Context的一个代理模式的实现。
而 该方法 仅在Activity.attach 方法调用,后者是在 framework 创建 Activity 的时候调用的
再看这段调用
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
Activity activity = null;
try {
java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
} catch (Exception e) {
}
try {
if (activity != null) {
ContextImpl appContext = new ContextImpl();
appContext.init(r.packageInfo, r.token, this);
appContext.setOuterContext(activity);
CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
Configuration config = new Configuration(mCompatConfiguration);
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config);
发现也是传入的ContextImpl实现类来输入上下文。 因此这个attachbasecontext 事实上是在启动activity之前就调用了 在oncreate之前