1 LauncherApplication的功能
LauncherApplication对象存储了在launcher2中使用的一些管理对象,由于LauncherApplication是全局对象,所以
保证了随时随地可以获取这些管理对象
2 LauncherApplication的核心方法
onCreate为核心方法,在该方法中创建了这些管理对象,并注册了一些广播接收器
3 LauncherApplication中onCreate方法代码走读流程
@Override
public void onCreate() {
super.onCreate();
// set sIsScreenXLarge and sScreenDensity *before* creating icon cache
sIsScreenLarge = getResources().getBoolean(R.bool.is_large_screen);
sScreenDensity = getResources().getDisplayMetrics().density;
recreateWidgetPreviewDb();
mIconCache = new IconCache(this); //创建IconCache对象
mModel = new LauncherModel(this, mIconCache);//创建LauncherModel对象
LauncherApps launcherApps = (LauncherApps)
getSystemService(Context.LAUNCHER_APPS_SERVICE);
launcherApps.registerCallback(mModel.getLauncherAppsCallback());
// 注册广播接收器,用于监视安装新的android应用
// Register intent receivers
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_LOCALE_CHANGED); //用于监视国家和地区是否发生变化
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED); ////用于监视配置是否发生变化,如横竖屏切换
registerReceiver(mModel, filter);
filter = new IntentFilter();
filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
registerReceiver(mModel, filter);
filter = new IntentFilter();
filter.addAction(SearchManager.INTENT_ACTION_SEARCHABLES_CHANGED);
registerReceiver(mModel, filter);
// Register for changes to the favorites
ContentResolver resolver = getContentResolver(); //用于监视桌面图标数据库是否发生变化
resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,
mFavoritesObserver);
}
/**
* Receives notifications whenever the user favorites have changed.
*/
private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
// If the database has ever changed, then we really need to force a reload of the
// workspace on the next load
//如果桌面图标数据库发生了变化,重新再后台装载桌面
mModel.resetLoadedState(false, true);
mModel.startLoaderFromBackground();
}
};
oncreate方法中的代码包含的信息很多,除了创建launcherModel和IconCache对象外,剩下的工作就是进行监视。
这里的监视指探测应用程序状态、android系统状态以及存储桌面图标数据库是否发生变化,如果发生变化,就会进行
一系列的处理工作。除了图标、数据库外,其他的监视工作是通过广播接收器完成的。
LauncherModel是launcher2的管理中枢,该类不仅完成了大量的控制任务,还负责监视系统的各种状态。
最后使用如下代码注册了一个用于监视图标数据库是否发生变化的监视器
// Register for changes to the favorites
ContentResolver resolver = getContentResolver();
resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,
mFavoritesObserver);
LauncherSettings.Favorites.CONTENT_URI该常量是待监视数据要满足的条件
/**
* Receives notifications whenever the user favorites have changed.
*/
private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
// If the database has ever changed, then we really need to force a reload of the
// workspace on the next load
//如果桌面图标手机看看发生了变化,重新在后台装载桌面
mModel.resetLoadedState(false, true);
mModel.startLoaderFromBackground();
}
};
launcher2中有一个content provider类launcherProvider,该类用于对launcher.db中的表(目前只有favorites)进行增、删、改、查。使用insert、delete、update方法修改完数据后,调用sendnotify方法通知系统数据已经变化
private void sendNotify(Uri uri) {
String notify = uri.getQueryParameter(PARAMETER_NOTIFY);
if (notify == null || "true".equals(notify)) {
//由系统完成
getContext().getContentResolver().notifyChange(uri, null);
}
}
sendNotify方法从Uri中获取了notify参数的值,如果该参数值为true,则通知系统favorites表的数据已经发生了变化
下面是launcherProvider.insert方法代码,在该方法中想favorites变成功插入数据后,会调用sendNotify方法通知系统favorites表的数据已经变化。
@Override
public Uri insert(Uri uri, ContentValues initialValues) {
SqlArguments args = new SqlArguments(uri);
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final long rowId = dbInsertAndCheck(mOpenHelper, db, args.table, null, initialValues);
if (rowId <= 0) return null;
uri = ContentUris.withAppendedId(uri, rowId);
sendNotify(uri); //通知系统favorites表的数据已经发生了变化
return uri;
}
监视器的回调方法ContentObserver.onChange实际上是由content provider在相应的方法(insert,delete,update)中通知系统调用的。
注:本文的创作是根据李宁的书籍android深度探索进行分解的