最近开始看Android Launcher源码,对一些关键类进行整理,想和大家分享一下。
关于Launcher布局、自定义布局属性等,以下博文已经进行详细的介绍,我就不再展开了,在此分享链接,感谢“stevenhu_223"的分享。
Launcher源码浅析-----Launcher布局
Launcher源码浅析-----Launcher自定义布局属性
Launcher源码浅析-----Launcher启动时的资源加载
Launcher源码浅析-----涉及Workspace界面资源加载重要类和资源文件简介
LauncherApplication类
在Launcher启动时,会先去加载LauncherApplication类,主要是对CacheDB(Widget预览缓存DB)、IconCache(Icon缓存类)、launcherModel(资源加载工作类)、LauncherProvider(数据共享类)的初始化,以及对Package添加、删除、改变等注册监听,代码如下:
public void onCreate() {
super.onCreate();
......
mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(this );
mIconCache = new IconCache(this);
mModel = new LauncherModel(this, mIconCache);
// 注册接收器
IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED );
filter.addAction(Intent. ACTION_PACKAGE_REMOVED);
filter.addAction(Intent. ACTION_PACKAGE_CHANGED);
filter.addDataScheme( "package");
registerReceiver( mModel, filter);
......
// Register for changes to the favorites
ContentResolver resolver = getContentResolver();
resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,
mFavoritesObserver);
}
//当数据改变时,会重新加载workspace
private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
mModel.resetLoadedState( false, true );
mModel.startLoaderFromBackground();
}
};
Launcher类
Launcher是Activity类型,我们可以重点看下oncreate()函数的执行流程:
protected void onCreate(Bundle savedInstanceState) {
......
super.onCreate(savedInstanceState);
LauncherApplication app = ((LauncherApplication)getApplication());
mModel = app.setLauncher( this);//设置资源加载工作类
mIconCache = app.getIconCache();//获取Icon缓存类
mDragController = new DragController(this); //初始化拖拽控制类
mAppWidgetManager = AppWidgetManager.getInstance(this); //初始化App小工具管理类
mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);
mAppWidgetHost.startListening();//开始监听 App Widget的改变,当你的activity开始显示的时候,被调用
......
checkForLocaleChange(); //检测本地语言是否改变
setContentView(R.layout. launcher);//加载视图
setupViews(); //初始化视图
showFirstRunWorkspaceCling(); //显示第一次运行workspace的指引
registerContentObservers(); //注册收藏夹监听器
lockAllApps();
restoreState( mSavedState);//如果存在,还原之前的状态,包括屏幕状态,屏幕页数
//在还原之前的状态之后,更新自定义抽屉
if (mAppsCustomizeContent != null) {
mAppsCustomizeContent.onPackagesUpdated(
LauncherModel.getSortedWidgetsAndShortcuts( this));
}
if (!mRestoring ) {
if (sPausedFromUserAction ) {
//如果用户离开Launcher,当他们返回时,我们将只异步加载items
mModel.startLoader( true, -1);
} else {
//如果用户翻转(或者触发设置改变),当launcher在前台,我们仅仅异步加载这个页面
mModel.startLoader( true, mWorkspace.getCurrentPage());
}
}
//如果所有的App没有被加载完成,显示进度条
if (!mModel .isAllAppsLoaded()) {
ViewGroup appsCustomizeContentParent = (ViewGroup) mAppsCustomizeContent .getParent();
mInflater.inflate(R.layout.apps_customize_progressbar, appsCustomizeContentParent);
}
IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS );
//注册关闭系统Dialog接收器
registerReceiver( mCloseSystemDialogsReceiver, filter);
//更新全局icon
updateGlobalIcons();
//在界面中,我们希望基于目前的方向屏幕自动选择
unlockScreenOrientation( true);
}