通过服务启动应用的流程(类似SystemUi启动流程)
1. 服务启动触发条件
服务启动可以由多种事件触发:
- 显式 Intent:应用内调用
startService(Intent)
或bindService()
。 - 隐式 Intent:通过系统广播(如
BOOT_COMPLETED
)触发。 - 系统服务调用:如
ActivityManagerService
启动 SystemUI 服务。
2. 完整启动流程
步骤 1:触发服务启动请求
// 应用代码中启动服务
Intent serviceIntent = new Intent(this, MyService.class);
startService(serviceIntent);
步骤 2:检查应用进程状态
- 若进程已运行:直接进入步骤 4。
- 若进程未运行:系统通过
Zygote
创建新进程(见步骤 3)。
步骤 3:创建应用进程
- Zygote 分叉:
ActivityManagerService
调用ZygoteProcess.forkAndSpecialize()
创建应用进程。 - 加载系统资源:
新进程继承 Zygote 的预加载类和资源。
步骤 4:初始化组件工厂(AppComponentFactory)
系统通过 android:appComponentFactory
属性实例化自定义工厂(如果存在):
// 自定义 AppComponentFactory
public class MyComponentFactory extends AppComponentFactory {@NonNull@Overridepublic Application instantiateApplicationCompat(@NonNull ClassLoader cl, @NonNull String className)throws InstantiationException, IllegalAccessException, ClassNotFoundException {// 可在此注入依赖或替换 Application 类return super.instantiateApplicationCompat(cl, className);}
}
步骤 5:创建并初始化 Application
- 实例化 Application:
组件工厂调用super.instantiateApplicationCompat()
创建Application
实例。 - 调用 onCreate():
系统回调Application.onCreate()
,执行全局初始化(如初始化第三方库)。
步骤 6:通过组件工厂创建 Service
系统调用组件工厂的 instantiateServiceCompat()
方法:
@NonNull
@Override
public Service instantiateServiceCompat(@NonNull ClassLoader cl, @NonNull String className,@Nullable Intent intent) throws InstantiationException,IllegalAccessException, ClassNotFoundException {// 可在此注入依赖或替换 Service 类return super.instantiateServiceCompat(cl, className, intent);
}
步骤 7:Service 生命周期回调
- onCreate():
服务首次创建时调用,初始化资源(如开启线程、注册广播接收器)。 - onStartCommand():
每次调用startService()
时触发,处理服务逻辑(如后台任务)。
3. 时序图
应用调用 startService()↓
检查进程是否存在↓[不存在]
Zygote 创建新进程↓
初始化 AppComponentFactory↓
创建 Application 实例 → 调用 onCreate()↓
通过工厂创建 Service 实例↓
Service.onCreate() → onStartCommand()
4. 关键代码示例
AndroidManifest.xml
<applicationandroid:name=".MyApplication"android:appComponentFactory=".MyComponentFactory"tools:replace="android:appComponentFactory"><serviceandroid:name=".MyService"android:enabled="true"android:exported="false"/>
</application>
MyApplication.java
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();// 全局初始化(如数据库、网络库)Database.init(this);NetworkClient.setup();}
}
MyService.java
public class MyService extends Service {@Overridepublic void onCreate() {super.onCreate();// 初始化服务资源mExecutor = Executors.newSingleThreadExecutor();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// 执行后台任务mExecutor.execute(() -> {// 长时间运行的操作downloadFile(intent.getStringExtra("url"));});return START_STICKY;}
}
总结
通过服务启动应用的核心流程是:触发请求 → 检查进程 → 创建进程 → 初始化 Application → 创建并启动 Service。理解这一流程有助于优化应用启动性能、处理依赖注入,以及解决多进程场景下的初始化问题。