代码改变世界

Android系统启动过程

2012-08-28 18:03 by tang768168, 388 阅读, 0 推荐, 收藏, 编辑
摘要:Android系统启动过程首先Android框架架构图:(来自网上,我觉得这张图看起来很清晰) Linux内核启动之后就到Android Init进程,进而启动Android相关的服务和应用。启动的过程如下图所示:(图片来自网上,后面有地址) 下面将从Android4.0源码中,和网络达人对此的总结中,对此过程加以学习了解和总结,以下学习过程中代码片段中均有省略不完整,请参照源码。一 Init进程的启动 init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完... 阅读全文

说说Android桌面(Launcher应用)背后的故事(大结局)——让Widget拥有Application同等的待遇

2012-07-30 15:07 by tang768168, 538 阅读, 0 推荐, 收藏, 编辑
摘要:前一篇中,演示了如何开发一个Widget以及如何开发一个WidgetHost应用。有了这个基础,我们就知道,要想在桌面上添加Widget,那么需要完成两件事情:1、将桌面应用实现为一个WidgetHost应用2、CellLayout需要为每个添加的Widget分配足够大小的空间但是,为了添加到桌面上的widget能够和application们一样,那就应该具备如下的功能:3、Widget可以拖动4、Widget能够在多屏幕之间滑动5、widget能够从桌面移除对于第一个问题,上一篇中已经介绍了,就是在应用中加几段代码就可以解决了。关键问题是第二个,前面我们面临的都是最小的只占一个单元格大小的A 阅读全文

说说Android桌面(Launcher应用)背后的故事(九)——让我的桌面多姿多彩

2012-07-30 15:06 by tang768168, 407 阅读, 0 推荐, 收藏, 编辑
摘要:到这里我们的Launcher已经可以跑起来了,而且效果也如系统Launcher一般,但是,遗憾的是,我们的桌面上似乎都是一个摸样的Shortcut,而再看看系统桌面上,Search框,天气控件啊,各种大小参差不齐,界面上的控件丰富多彩。桌面上除了一个个Shortcut之外,还应该有各种大小不一的控件——Widget。 要想让我们的桌面也支持Widget,我们就要对Widget这个东西稍加研究一翻。Widget是一种特殊的独立体,可以嵌入在另一个应用中,只要这个应用实现为一个WidgetHost,那么它就可以容纳各式各样的Widget。Android已经提供了一套Widget开发接口,包括两个方 阅读全文

说说Android桌面(Launcher应用)背后的故事(八)——让桌面的精灵穿越起来

2012-07-30 15:04 by tang768168, 434 阅读, 1 推荐, 收藏, 编辑
摘要:有了前面的工作,基本上这个桌面就已经像模像样了,但是,和系统自带的Launcher相比,还差得很远。其中,系统Launcher的桌面上的item是可以任意穿越(移动)的。同时,在其穿越的过程中,你也可以将其kill掉。在这篇文章中,就让我们来看看桌面上的精灵如何实现她们穿越的梦想…. 系统Launcher为了实现item的拖拽,可谓下了很大的功夫,面面俱到。为了实现拖拽的功能,其定义了一组比较抽象的概念:拖拽源(DragSource);拖拽目的地(DragTarget);拖拽控制器(DragController);和拖拽界面(DragLayer)。DragSource主要用来表示桌面上的ite 阅读全文

说说Android桌面(Launcher应用)背后的故事(七)——又是一个附属品(可以转动的绚烂饼图)

2012-07-30 15:03 by tang768168, 365 阅读, 0 推荐, 收藏, 编辑
摘要:本来这一篇应该还是写Launcher中item拖拽的实现原理的,奈何,自从研究了Launcher,以前没有实现的,现在灵感全来了。这不,一个月前看到了著名记账软件随手记,看到android版中有一个炫酷的可以旋转的统计饼图,当时,下载了APK,反编译了下,奈何,不知道是不是在代码中进行了处理,没有反编译出源码来,半点都没有。只反编译成功了资源文件。当时,这个事情就放下了,虽然心很有不甘。但是,网上也没有看到有人实现,只能作罢。可是当研究完了Launcher之后,再来考量一下其实现原理,竟然恍然大悟般,于是乎,今天一天的时间,终于实现了其一样的功能。我现在倒觉得,分析了Launcher源码之后, 阅读全文

说说Android桌面(Launcher应用)背后的故事(五)——桌面壁纸的添加

2012-07-30 15:00 by tang768168, 377 阅读, 0 推荐, 收藏, 编辑
摘要:上一篇中,我们了解了Workspace是如何处理多个CellLayout之间的滑动的。这篇,将记录如何将壁纸添加到桌面,以及Workspace如何处理滑动的时候,壁纸的滑动。壁纸的添加,也是调用系统自带的,用如下方式调用:[java] view plaincopy//调用系统自带壁纸选择功能,ACTION_SET_WALLPAPER为选择的时候使用的过滤条件 Intent chooseIntent = new Intent(Intent.ACTION_SET_WALLPAPER); //启动系统选择应用 Intent intent = new Intent(Intent.ACTION_CHO. 阅读全文

说说Android桌面(Launcher应用)背后的故事(六)——研究Launcher而实现的附属品(可以拖拽的ListView)

2012-07-30 15:00 by tang768168, 469 阅读, 0 推荐, 收藏, 编辑
摘要:本来这一篇将写Android中Launcher是如何实现桌面上item的拖拽的,当研究了其机理之后,突然大脑发热,想实现一个可以拖拽的ListView,在理解了Launcher中item的拖拽,再来实现可以拖拽的ListView简直就是小菜一碟了。于是将此篇位于Launcher中拖拽之前,可以起到一个过渡理解的作用。只是,这里还有些不一样的地方就是Launcher上item拖拽后可以放到一个空的位置,而ListView中某个item被拖拽之后是需要交换新位置和原来位置上的item。下面,就不再废话了,直接上代码,具体需要注意的地方请看注释:[java] view plaincopypublic 阅读全文

说说Android桌面(Launcher应用)背后的故事(四)——揭秘Workspace

2012-07-30 14:59 by tang768168, 629 阅读, 0 推荐, 收藏, 编辑
摘要:前面说了Layout最主要的职责就是负责item的布局和空间的分配,这一节我们继续来看看CellLayout的父亲控件Workspace。手机的桌面是由几个屏幕的,你可以任意滑动的。这个布局就是一个Workspace。Launcher的Workspace主要的职责就是处理多个屏幕之间的滑动和壁纸的添加。这里先提下,我们知道DragLayer包含了Workspace,Workspace又包含了几个CellLayout,那么我们首先应该知道,它们是如何各司其职而互不影响的。这个就是Android中事件的传递机制。我们知道,一个应用中,整个的布局是一个树状,那么当用户的一个Touch操作,比如点击事 阅读全文

说说Android桌面(Launcher应用)背后的故事(三)——CellLayout的秘密

2012-07-30 14:57 by tang768168, 828 阅读, 0 推荐, 收藏, 编辑
摘要:CellLayout的设计主要为了存放大小不一的控件。为了更好的控制item的添加和删除,选择直接继承ViewGroup来实现该控件。我们长按桌面的时候,有两种情况,一种是我们按的是一个item,还有一种是我们按的是一个空的位置。这里,就有一个问题。1、我怎么知道当前按下的位置上是空白区域还是item呢?2、就算我知道了当前的位置坐标,我又如何知道当前的坐标属于哪个单元格呢?3、如果上面两个问题都解决了,当我选择了某个要添加的item,这个item怎么样才能添加到指定的单元格呢,怎么根据当前item的大小来分配大小合适的空间呢?为了处理单元格和item占据的空间问题,CellLayout按照如 阅读全文

说说Android桌面(Launcher应用)背后的故事(二)——应用程序的添加

2012-07-26 18:40 by tang768168, 572 阅读, 0 推荐, 收藏, 编辑
摘要:上篇中,讲到了第一个功能中需要获取应用程序的信息,然后添加到桌面。这里,先记录下如何获取Android中的应用程序信息。一、调用系统快捷方式列表[java] view plaincopyIntent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY); pickIntent.putExtra(Intent.EXTRA_INTENT, new Intent(Intent.ACTION_CREATE_SHORTCUT)); pickIntent.putExtra(Intent.EXTRA_TITLE, res.getString(R.str.. 阅读全文