android自带的Launcher2分析
一、编译
首先是在eclipse下的编译,需要添加两个库:
/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar,
更名为framework.jar,添加系统下的一些类,如SystemProperty等。
还有一个是/out/target/common/obj/JAVA_LIBRARIES/android-common_intermediates/classes.jar,
更名为common.jar,添加com.android.common包的一些类,其中framework.jar需要置顶。
添加库后编译成功。
然后是修改程序包名,应用的包名在项目目录上右键选择Android Tools/Rename Application Package,
子包名可在需要修改的包名上右键选择Refactor/Rename,
修改后可能需要再修改部分layout下的xml文件,这里可以使用替换,比如将com.android.launcher2替换为com.mypackage.launcher
修改编译成功后可运行。
二、分析AndroidManifest.xml
在manifest中添加了许多自定义的permission,如PRELOAD_WORKSPACE,INSTALL_SHORTCUT等。
uses-permission下主要定义了
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.SET_WALLPAPER" />
<uses-permission android:name="android.permission.SET_WALLPAPER_HINTS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="com.hualu.tv.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.hualu.tv.launcher.permission.WRITE_SETTINGS" />
在manifest中主要定义了一个application,两个activity,四个receiver,和一个provider
三、辅助类
1、分析LauncherApplication.java
Application的onCreate中主要完成
1). 获取屏幕的大小和密度(分辨率)
2). 初始化IconCache
3). 初始化LauncherModel
4). 注册BroadcastReceiver,事件包括:程序安装、卸载、变换(如升级);
扩展存储可用/不可用;本地语言变化;本地配置变化(如横竖屏);
搜索管理相关的变换
5). 监控LauncherSettings.Favorites.CONTENT_URI的变化
2、分析IconCache.java
在构造时得到PackageManager mPackageManager,IconDensity mIconDpi,和默认的Icon的Bitmap mDefaultIcon
mCache为缓冲,大小由INITIAL_ICON_CACHE_CAPACITY控制,根据传进来的ComponentName信息获取CacheEntry
(应用程序图标和标题),如果有则直接返回,如果没有则根据ResolveInfo获取信息并保存返回。
主要对外接口为getTitleAndIcon和getIcon
3、分析AllAppsList.java
存储所有应用程序的列表,提供了添加,删除,修改等操作。会将应用中所有包含Intent.ACTION_MAIN
和Intent.CATEGORY_LAUNCHER信息的Activity均加入列表。
addPackage, removePackage, updatePackage均使用包名对app进行添加、删除、更新操作
4、分析ItemInfo.java, ShortcutInfo.java, ApplicationInfo.java, FolderInfo.java
ItemInfo是launcher中一个元素的信息,主要包含类型,坐标等。
ShortcutInfo是应用快捷方式的信息,基于ItemInfo,主要存储应用启动intent信息和图标信息。
ApplicationInfo是应用程序信息,基于ItemInfo,主要存储应用启动intent信息和图标信息。
FolderInfo是目录的信息,基于ItemInfo,主要存储目录和应用或应用快捷方式信息。提供添加、删除、设置标题操作,并有对应listener
5、分析LauncherProvider
ContentProvider,提供对目录、小控件或应用快捷方式的位置和图标信息的操作,并操作本地数据库launcher.db的favorites表。
6、分析LauncherSettings.java
定义item类型和ContentProvider的Uri。
7、分析LauncherModel.java
这是一个BroadcastReceive的继承类,所以从分析OnReceive()开始:
1).ACTION_PACKAGE_CHANGED,ACTION_PACKAGE_REMOVED和ACTION_PACKAGE_ADDED
通过intent.getData().getSchemeSpecificPart()获得应用程序包名,intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) 获得是否是升级,默认是false。
用整型op保存操作类型,最后调用PackageUpdatedTask()传入操作类型和包名,这是个线程,主要完成对AllAppsList的内容进行添加、删除、修改,
并通过自定义的Callbacks接口通知UI进行更新。
2).ACTION_EXTERNAL_APPLICATIONS_AVAILABLE和ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE
调用PackageUpdatedTask()添加、删除。
3).ACTION_CONFIGURATION_CHANGED和ACTION_LOCALE_CHANGED
调用forceReload()重新获取应用程序信息。
4).INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED和INTENT_ACTION_SEARCHABLES_CHANGED
调用回调Callbacks中的bindSearchablesChanged()通知UI。
四、界面相关
1、相关知识
横屏时调用layout_land,竖屏时调用layout_port,这里盒子调用的是layout_land。
主UI为Launcher.java,其布局文件layout_land/launcher.xml中定义了一个DragLayer,里面包含一个Workspace,Workspace中
可最多有5个CellLayout,
五、特效类