在android l中,系统服务的启动分为6个启动阶段,定义在SystemServer类中,大部分服务继承自SystemService类,通过重写onStart方法实现自身的初始化,同时可以重写onBootPhase方法来监听启动流程,以便在合适的时候执行相应动作,这些方法会由SystemServiceManager来调用。AppWidgetService亦是如此。
服务的启动只有一句,在在SystemServer的startOtherServices方法中
mSystemServiceManager.startService(APPWIDGET_SERVICE_CLASS);
具体分析其初始化
在SystemServiceManager.startService中,主要是实例化AppWidgetService类以及回调它的onStart方法
public <T extends SystemService> T startService(Class<T> serviceClass) {
// 检查服务是否继承自SystemService
final String name = serviceClass.getName();
Slog.i(TAG, "Starting " + name);
// Create the service.
if (!SystemService.class.isAssignableFrom(serviceClass)) {
throw new RuntimeException("Failed to create " + name
+ ": service must extend " + SystemService.class.getName());
}
final T service;
try {
Constructor<T> constructor = serviceClass.getConstructor(Context.class);
service = constructor.newInstance(mContext);
} catch (InstantiationException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service could not be instantiated", ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (NoSuchMethodException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service must have a public constructor with a Context argument", ex);
} catch (InvocationTargetException ex) {
throw new RuntimeException("Failed to create service " + name
+ ": service constructor threw an exception", ex);
}
// 保存引用,方便在各个boot phase回调其方法
mServices.add(service);
// Start it.
try {
service.onStart();
} catch (RuntimeException ex) {
throw new RuntimeException("Failed to start service " + name
+ ": onStart threw an exception", ex);
}
return service;
}
AppWidgetService的实现很简单
public class AppWidgetService extends SystemService {
private final AppWidgetServiceImpl mImpl;
public AppWidgetService(Context context) {
super(context);
mImpl = new AppWidgetServiceImpl(context);
}
@Override
public void onStart() {
// 注册该服务为实名系统服务appWidget
publishBinderService(Context.APPWIDGET_SERVICE, mImpl);
AppWidgetBackupBridge.register(mImpl);
}
@Override
public void onBootPhase(int phase) {
if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
mImpl.setSafeMode(isSafeMode());
}
}
}
其中onStart方法在前面已经调用,onBootPhase则在每个boot phase时由SystemServiceManager的startBootPhase方法调用。
接下来看一下AppWidgetServiceImpl的初始化
AppWidgetServiceImpl(Context context) {
mContext = context;
mPackageManager = AppGlobals.getPackageManager();
mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
mAppOpsManager = (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE);
mSaveStateHandler = BackgroundThread.getHandler();
mCallbackHandler = new CallbackHandler(mContext.getMainLooper());
mBackupRestoreController = new BackupRestoreController();
mSecurityPolicy = new SecurityPolicy();
computeMaximumWidgetBitmapMemory();
registerBroadcastReceiver();
registerOnCrossProfileProvidersChangedListener();
}
主要是获取各种系统服务的引用,其中注册BroadcastReceiver用于监听包安装,系统配置改变,系统用户该表等事件。
可以看到在AppWidgetService的初始化过程中仅仅只是初始化一些引用,监听系统变化,并没有开始做任何的数据加载等操作。
数据加载操作应该会在首次使用AppWidgetService时调用,有必要看一下内部的几个重要的数据结构,它们用来描述AppWidget框架中Host和Provider的信息。
1. ProviderId:包含user和component信息
2. Provider:用于描述一个Provider
3. HostId:包含user,host id和package信息
4. Host:用于描述一个Host
5. Widget:描述一个显示的小插件