android 源码中 launcher2 的分析

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,

 

五、特效类

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值