You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4.0 KiB
4.0 KiB
Framework 用到了哪些设计模式?
- 是否熟悉常用的设计模式
- 是否对 Framework 源码有所了解
- 是否善于学习和总结
单例模式
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>(){
protected IActivityManager create(){
IBinder b = ServiceManager.getService("activity");
IActivityManager am = asInterface(b);
return am;
}
}
static public IActivityManager getDefault(){
return gDefault.get();
}
// 线程间单例
private static final ThreadLocal<Choreographer> sThreadInstance = new ThreadLocal<Choreographer>(){
@Override
protected Choreographer initialValue(){
Looper looper = Looper.myLooper();
return new Choreographer(looper);
}
}
public static Choreographer getInstance(){
return sThreadInstance.get();
}
// 进程间单例
// 单例:ServiceManager 中间人:Binder 驱动
int main(int argc, char **argv){
struct binder_state *bs;
bs = binder_open(128*1024);
binder_become_context_manager(bs);
}
private static IServiceManager getIServiceManager(){
if(sServiceManager != null){
return sServiceManager;
}
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
return sServiceManager;
}
sp<IBinder> ProcessState::getContextObject(const sp<IBinder>&){
return getStrongProxyForHandle(0);
}
观察者模式
public class ContentObservable extends Observable<ContextObserver>{
@OVerride
public void registerObserver(ContentObserver observer){
super.registerObserver(observer)l
}
public void notifyChange(boolean selfChange){
synchronized(mObservers){
for(ContentObserver observer: mObservers){
observer.onChange(selfChange, null);
}
}
}
}
void registerContentObserver(..., ContentObserver obsserver, ...){
getContentService().registerContentObserver(..., observer.getContentObserver(), ...);
}
public IContentOnserver getContentObserver(){
synchronized(mLock){
if(mTransport == null){
mTransport = new Transport(this);
}
return mTransport;
}
}
private static final class Transport extends IContentObserver.Stub{
private ContentObserver mContentObserver;
public Transport(ContentObserver contentObserver){
mContentObserver = contentObserver;
}
@Override
public void onChange(boolean selfChange, Uri uri, int userId){
ContentObserver contentObserver = mContentObserver;
if(contentObserver!=null){
contentObserver.dispatchChange(selfChange, uri, userId);
}
}
}
代理模式
静态代理:
class ActivityManagerProxy implements IActivityManager{
private IBinder mRemote;
public ActivityManagerProxy(IBinder remote){
mRemote. = remote;
}
}
class ActivityManagerNative extends Binder implements IActivityManager{
static public IActivityManager asInterface(IBinder obj){
if(obj == null){
return null;
}
IActivityManager in = (IActivityManager)obj.queryLocalInterface(descriptor);
if(in != null){
return in;
}
return new ActivityManagerProxy(obj);
}
}
int startActivity(IApplicationThread caller, ...) throws RemoteException{
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
}
动态代理:
public class Decorator<T> implements InvocationHandler{
private final T mObject;
private final DecoratorListener mListener;
public static <T> T newInstance(T obj, DecoratorListener listener){
return (T)Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),new Decorator<T>(obj, listener));
}
private Decorator(T obj, DecoratorListener listener){
this.mObject = obj;
this.mListener = listener;
}
}