Android源码——Application源码解析

继承结构

Application实例将在应用程序创建的时候初始化,所以是一个单例

public class Application extends ContextWrapper implements ComponentCallbacks2 {

}

private ArrayList<ComponentCallbacks> mComponentCallbacks = new ArrayList<ComponentCallbacks>();
private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks = new ArrayList<ActivityLifecycleCallbacks>();
public LoadedApk mLoadedApk;

接口

生命周期回调,可实现用于特殊Activity的处理

public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}

外部方法

构造方法

创建Application时会创建一个空的context

public Application() {
    super(null);
}

生命周期

当application启动时调用,会在activity、service、broadcast receiver之前创建(不包括content providers),重写需调用super.onCreate(),不应放置耗时操作,否则会影响性能

public void onCreate() {
}

用于模拟器,当程序被kill时调用

public void onTerminate() {
}

添加和删除

加锁防止并发修改

public void registerComponentCallbacks(ComponentCallbacks callback) {
    synchronized (mComponentCallbacks) {
        mComponentCallbacks.add(callback);
    }
}
public void unregisterComponentCallbacks(ComponentCallbacks callback) {
    synchronized (mComponentCallbacks) {
        mComponentCallbacks.remove(callback);
    }
}
public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
    synchronized (mActivityLifecycleCallbacks) {
        mActivityLifecycleCallbacks.add(callback);
    }
}
public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
    synchronized (mActivityLifecycleCallbacks) {
        mActivityLifecycleCallbacks.remove(callback);
    }
}

转为数组

加锁防止组件中途销毁,出现不一致

private Object[] collectComponentCallbacks() {
    Object[] callbacks = null;
    synchronized (mComponentCallbacks) {
        if (mComponentCallbacks.size() > 0) {
            callbacks = mComponentCallbacks.toArray();
        }
    }
    return callbacks;
}

private Object[] collectActivityLifecycleCallbacks() {
    Object[] callbacks = null;
    synchronized (mActivityLifecycleCallbacks) {
        if (mActivityLifecycleCallbacks.size() > 0) {
            callbacks = mActivityLifecycleCallbacks.toArray();
        }
    }
    return callbacks;
}

遍历调用

调用各组件的onConfigurationChanged()

public void onConfigurationChanged(Configuration newConfig) {
    Object[] callbacks = collectComponentCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ComponentCallbacks)callbacks[i]).onConfigurationChanged(newConfig);
        }
    }
}

public void onLowMemory() {
    Object[] callbacks = collectComponentCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ComponentCallbacks)callbacks[i]).onLowMemory();
        }
    }
}

public void onTrimMemory(int level) {
    Object[] callbacks = collectComponentCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            Object c = callbacks[i];
            if (c instanceof ComponentCallbacks2) {
                ((ComponentCallbacks2)c).onTrimMemory(level);
            }
        }
    }
}

这里转为Object[]再遍历,而不直接利用ArrayList遍历,应该是为了避免调用过程中ArrayList的状态被改变

内部方法

defalut方法,同一包下才可调用

/* package */ final void attach(Context context) {
    attachBaseContext(context);
    mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
}
/* package */ void dispatchActivityCreated(Activity activity, Bundle savedInstanceState) {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ActivityLifecycleCallbacks)callbacks[i]).onActivityCreated(activity,
                    savedInstanceState);
        }
    }
}
/* package */ void dispatchActivityStarted(Activity activity) {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStarted(activity);
        }
    }
}
/* package */ void dispatchActivityResumed(Activity activity) {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ActivityLifecycleCallbacks)callbacks[i]).onActivityResumed(activity);
        }
    }
}
/* package */ void dispatchActivityPaused(Activity activity) {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ActivityLifecycleCallbacks)callbacks[i]).onActivityPaused(activity);
        }
    }
}
/* package */ void dispatchActivityStopped(Activity activity) {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity);
        }
    }
}
/* package */ void dispatchActivitySaveInstanceState(Activity activity, Bundle outState) {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ActivityLifecycleCallbacks)callbacks[i]).onActivitySaveInstanceState(activity,
                    outState);
        }
    }
}
/* package */ void dispatchActivityDestroyed(Activity activity) {
    Object[] callbacks = collectActivityLifecycleCallbacks();
    if (callbacks != null) {
        for (int i=0; i<callbacks.length; i++) {
            ((ActivityLifecycleCallbacks)callbacks[i]).onActivityDestroyed(activity);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值