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.

112 lines
2.4 KiB

---
谈谈你对 Application 的理解
---
1. 了解 Application 的作用
2. 熟悉 Application 的类继承关系以及生命周期
3. 深入理解 Application 的初始化原理
#### Application 有什么用?
1. 应用进程初始化操作
2. 提供上下文
#### Application 怎么初始化?
```java
// ActivityThread#attach
private void attach() {
final IActivityManager mgr = ActivityManagerNative.getDefault();
mgr.attachAppliation(mAppThread);
}
```
```java
// AMS
public final void attachApplication(IApplicationThread thread) {
synchronized(this) {
attachApplicationLocked(thread, callingPid);
}
}
```
```java
boolean attachApplicationLocked(IApplicationThread thread, ...) {
//...
// IPC 调用,回到应用进程
thread.bindApplication(...);
}
```
```java
public final void bindApplication(...) {
AppBindData data = new AppBindData();
//...
sendMessage(H.BIND_APPLICATION, data);
}
```
```java
private void handleBindApplication(AppBindData data) {
// LoadedApk
data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
// LoadedApk#makeApplication
Application app = data.info.makeApplication(...);
// Application#onCreate
mInstrumentation.callApplicationOnCreate(app);
}
```
```java
public Application makeApplication(...) {
if(mApplication != null) {
return mApplication;
}
ContextImpl appContext = ContextImpl.createAppContext(...);
app = mActivityThread.mInstrumentation.newApplication(...);
return app;
}
```
```java
Application new Application(ClassLoader cl, String className, Context context) {
return newApplication(cl.loadClass(className), context);
}
```
```java
static Application newApplication(Class<?> clazz, Context context) {
Application app = (Application)clazz.newInstance();
app.attach(context);
return app;
}
```
```java
final void attach(Context context) {
attachBaseContext(context);
}
```
总结一下 Application 的初始化:
1. new Application()
2. Application.attachBaseContext()
3. Application.onCreate()
**不要执行耗时操作**
```java
boolean attachApplicationLocked(IApplicationThread thread, ...) {
//...
// IPC 调用,回到应用进程
thread.bindApplication(...);
//...
// 启动待启动的组件
mStackSupervisor.attachApplicationLocked(...);
mServices.attachApplicationLocked(app, processName);
sendPendingBroadcastsLocked(app);
}
```