代理是什么
代理是一种设计模式,分为静态代理和动态代理。
没有代理前,调用是这样的:
- 调用者
- 业务细节实现
调用后,它们的调用顺序是这样的:
- 调用者
- 业务逻辑(一般是抽象方法或者是接口)
- 业务细节实现
通过在中间加了一层代理,将业务逻辑与实现细节分层,方便了上层开发者。
代理可以实现方法增强,比如常用的日志、缓存等;也可以实现方法拦截,通过代理方法修改原方法的参数和返回值。
静态代理
通过用户手动编码或者在编译时自动生成。
在APPCompatActivity中的APPCompatDelegate抽象类就是静态代理,而抽象类的具体实例化是在静态语句块static{}区中根据版本号实现的,这样写可以避免 Activity 本身的业务过于冗余,同时将抽象类(也可能是接口)与实现类相分离,这样上层开发者可以专注于业务,而不用管具体的实现。
动态代理
动态代理是java中的字节码生成技术。通过接口生成代理类,并将代理类的实现交给InvocationHandler作为具体的实现。
传统的静态代理模式需要为每一个需要代理的类写一个代理类,如果需要代理的类有几百个那不是要累死?为了更优雅地实现代理模式,JDK提供了动态代理方式。
动态代理主要处理InvocationHandler和Proxy类。
AppCompatDelegateImplBase extends AppCompatDelegate
AppCompatDelegate
{
AppCompatDelegateImplBase
}
AppCompatDelegateImplBase(Context context, Window window, AppCompatCallback callback){
mContext = context;
mWindow = window;
mAppCompatCallback = callback;
...
}
AppCompatActivity extends FragmentActivity implements AppCompatCallback, TaskStackBuilder.SupportParentable, ActionBarDrawerToggle.DelegateProvider{
}
现在我们将ActionBarActivity里面的内部逻辑都抽离出来,然后封装成一个单一的代理(delegate)api供调用,AppCompatDelegate.AppCompatDelegate可以被任意带有Window.Callback的安卓对象创建,比如Activity或者Dialog子类。
Android
Android系统在Java层的UI实现。在Android应用程序的四大组件中,只有Activity组件与UI相关,它描述的是
Android应用程序的窗口创建过程
每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。
SurfaceFlinger