android-launcher拖拽
转自 http// http// 最近研究 ICS4.0 的 Launcher,发现 4.0 和 2.3 有稍微点区别,但是区 别不是特别大,所以我就先整理一下 Launcher 启动的大致流程。 Launcher 其实是贯彻于手机的整个系统的,时时刻刻都在运行,要是 Launcher 不运行了,手机就得黑屏了。Launcher 的 LauncherModesingletask,所以说不管 Launcher 启动了哪个应用, 总有个 Launcher 的实例在堆栈中,并且位于栈底。点击 Home 键进 入到 Launcher,上篇 Android 的全局键(home 键/长按耳机键)详解 【android 源码解析八】中有详细的介绍。大致思路其实就是启动 launcher 的时候,新启动一个 task。大致先说这么多,先看截图 大明原创,转载请标明出处 http// 4.0 的 Launcher 界面,下面我们分步来解析一下 Launcher 的 启动过程。 Step 0首先要给大家介绍一下 Launcher 的数据库,这个数据库中存 放着待机界面的图标,主屏底部的应用程序图标和桌面 folder 中各应 用程序的图标,ICS4.0 的 folder 中只能放应用程序的快捷方式, shortcut 不能放到这个 folder 中,先看截图 图(2) 说说各字段的含义 title表示桌面应用程序的名字,有的 title 为空,表示是 widget 的快 捷方式; intent表示启动这个图标的 intent 放到数据库中,当 click 的时候就 会调用这个字段,启动相应的应用程序;container表示应用程序的容器,folder 的容器为整数,-100表示 在桌面的程序,-101 表示是主屏底部的程序; screen表示在第几个屏,folder 的 screen 都是 0, container-101 的 为 0,1,3,4;2 为 allapp 的按钮; cellX表示在屏幕 X 轴的位置,(0,1,2,3),左上角为 0 点,往右依 次增加; cellY表示在屏幕 Y 轴的位置,(0,1,2,3),左上角为 0 点,往下依 次增加; spallX表示占 X 轴几个格; spallY表示占 Y 轴几个格; itemType应用程序用 0 表示,shortcut 用 1 表示,folder 用 2 表示, widget 用 4 表示; appWidgetId-1 表示不是 widget ,数字大于 0 表示才是 widget ; isShortCut值为 0 表示不是应用程序的 ShortCut ,值为 1 表示是应 用程序的 ShortCut; iconType值为 0 表示图标的名字被定义为包名的资源 id,值为 1 表 示图标用 bitmap 保存; icon表示应用程序的图标,二进制的;显示为一张图片;说明folder 中的应用快捷方式绑定 folder--是用 container 的值 绑定 folder 的 id 的; 详细的讲解请参考 LauncherSettings.java 这个类,有数据库字段的详 细讲解; 手机是在第一次烧机完成后,数据库的值还没有,这时候 launcher 解 析 default_workspace.xml 把这个值存到数据库中;所以说想定制什么 样的开机桌面就在 default_workspace.xml 中做相应的配置,具体参照 我前面的博客 Android 中源码 Launcher 主屏幕程序排列详解【安卓 Launcher 进化 一】中有详细的介绍 i f convertDatabasedb { // Populate favorites table with initial favorites loadFavoritesdb, R.xml.default_workspace; } Step 1开机后先启动 LauncherApplication.java 这个类的 onCreate()方法,下面看代码 [java] view plaincopyprint 1. Override 2. public void onCreate { 3. super.onCreate; 4. 5. // set sIsScreenXLarge and sScreenDensity *before* creating icon cache 6. // 在创建图标缓存之前先设置sIsScreenXLarge 和屏幕设备的分辨率 7. final int screenSize getResources.getConfiguration.screenLayout 9. sIsScreenLarge screenSize Configuration.SCREENLAYOUT_SIZE_LARGE || 10. screenSize Configuration.SCREENLAYOUT_SIZE_XLARGE; 11. sScreenDensity getResources.getDisplayMetrics.density; 12. 13. // 实例化图标缓存区的对象 14. mIconCache new IconCachethis; 15. // 实例化一个LauncherModel 对象,这个类是保存Launcher 的内存启动状态,更新 Launcher 的数据库的作用 16. mModel new LauncherModelthis, mIconCache; 17. 18. // Register intent receivers 19. // 注册监听,应用package 增加,删除,改变的监听。 20. IntentFilter filter new IntentFilterIntent.ACTION_PACKAGE_ADDED; 21. filter.addActionIntent.ACTION_PACKAGE_REMOVED; 22. filter.addActionIntent.ACTION_PACKAGE_CHANGED; 23. filter.addDataScheme“package“; 24. registerReceivermModel, filter; 25. filter new IntentFilter; 26. // 注册application 是否可用,语言改变,方向改变的监听。4.0 支持横竖屏 27.