-------------------------------------------------------------------------
本文系本站原创,欢迎转载!
转载请注明出处:http://sjj0412.cublog.cn/
-------------------------------------------------------------------------
Android出来有一年多一点了,去年的时候玩过一下android,但仅限于插件安装,helloworld程序编写,由于当时没有Java基础,对eclipse也不清楚,且对于Java有着一种排斥反应,后来就没有继续玩android的了。其实当初对Java有排斥作用是由于我是搞嵌入式的,觉得懂c,c++就可以了,还有自己常用C#,就感觉没必要学再学另种高级语言java了,也不想学java。
所谓怕什么,来什么。这学期,教研室需要采用eclipse,java开发一个项目,不得以,不想上,创造条件也得上。于是后来看java相关东西,像java虚拟机,java模式,osgi,eclipse插件机制,这些让我对java有了一种全新的认识,同时也对高层的框架设计有了认识,也终于意识到,“存在就是合理的”,java的存在是由于它优秀的思想及架构的结果,尤其是看osgi framework的时候,发现这些框架的设计的理念是多么高超,同时也了解到java为什么是先出现在嵌入式领域的。
有了 java, eclipse的相关了解后,无意中我发现 android的一些消息,让我对其框架及运行机制有了极大兴趣。于是重新接触 android,像接触 qt, minigui, swt/jface窗体系统一样,我执行这样一种理念,先试用,看机制,再应用,试用后,我开始看 android的运行机制。下面就是我看的过程中的一些总结。Android程序主要由四部分构成:
1. Activity
2. Intent (这个很多人说是intent reciever)
3. Service
4. Content Provider
Activtiy:
Activity按功能可以总结为两种功能:我们平常所说的主窗体功能,还有就是服务功能及执行环境(主要是包环境,activity继承context)。
1)主窗口功能
Activity类可以看成是窗口类,它注册窗口,同时接受事件消息,并分发事件消息,其他的view(等价于我们熟悉控件control)都是以activity为主体,这个我们可以在acitivity的Oncreate看出一点端倪。
从上面就可以看出来,andorid中的view等价于现有一些窗体系统control对象,是控件的源头,上面TextView等价于label控件,Button名称一样。
public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
R.layout.main其实就是Vc里的资源Id差不多,它就是指向一个Layout资源,在我们这里是main.xml,android中以.xml组织资源,像string等。
当然前面注册窗口,接受消息的细节都是我们看不到,是属于android窗体系统的一部分,我们能够插手的是主窗体上的各种view的布局,及添加哪些view。
我们可以通过两种方法来设置我们的布局:
1. 编一个layout的x.xml文件,然后用setContentView(R.layout.x);
通过这种方式布局的,可以通过findviewby(id)来获得view(控件)接口,当然这个函数必须在setContentView执行后,且id代表的view在layout中,当然可以通过判断返回值是否为null来处理,其实这种方式是最好的,因为我们可以定义多个layout,然后不同情况就切换到不同layout,这样就可以达到不同显示界面的效果。
2. 在oncreate函数里,创建layout类实例x,然后添加其他view,然后setContentView(x);。
其实,android的窗体系统和当前桌面窗体系统差别很大,同时和其他的嵌入式的窗体系统像qt,minigui也有差别。Android最初的是面向嵌入式的,说的更小点是面向智能手机(smartphone).当然现在也是主要面向嵌入式,少部分会用到上网本,如果是上网本,估计会有改变,这里只针对智能手机上的android。由于像手机这些些嵌入式终端设备屏幕有限,资源有限,故和其他嵌入式窗体系统一样,窗口都是全屏的,当然不是说顶层窗体就完全覆盖屏幕,而是说只有顶层窗体是事件获取者,这个有点像vc中的模式窗体的味道,同时它又和其他的嵌入式窗体系统不同,这个不同主要体现在
一:android中没有子窗体的概念,activity可以创建一个activity,好像有点像子窗体的概念,但是各个activity是独立,都有各自独立的消息队列,各自独立的UI显示,所以这个就不是子窗体概念了。既然是独立的,那通信如何处理,这个就是通过intent来通信,这个很重要的东西将在后面探讨。
二:同时还有就是窗体的生命周期不一样,在其他窗机系统中,一个窗体创建了,除非我们手动kill窗体进程或点x退出窗体,窗体尽管失去焦点,它的资源还是存在的,只是由于它不在顶层,没有画出它的UI而已,但是在android,有很大变化,activity(窗体)是以栈的形式组织的,创建一个activity就压入,原来栈顶的窗体就会失去焦点,同时处于可删除状态,当然不是说就一定删除,而是可以删除它,这个在系统资源紧张的时候会发生。因此在写android的程序时,要注意的一个东西就包括,当activity失去焦点,也就是有新的activity创建时,在原来窗体系统中窗体退出时要进行的操作在此时就要进行,因为当activity失去焦点后,它就有被清除的可能,这个就在onpause函数可以进行相关操作。
Activity的生命周期如下。
Activity的退出是onstop函数反映的,这个就和我们常看到close一样了。
同时activity的回收优先级有如下规则:
1 .foreground process(显著进程)持有一个用户正在交互的屏幕顶层的Activity (他的onResume() 方法被调用),或者一个目前正在运行的 IntentReceiver (他的its onReceiveIntent() 方法正在执行)。系统中这样的进程并不多,一般情况下仅在内存已被耗尽不足以维持进程运行的时候作为万不得已而被Kill掉。通常这个时候设备已经到了存储器页面调整状态,因此这时kill是为了保证用户界面的响应而不得已要做的。
2. visible process(可见进程)持有一个用户在屏幕上可见的但并不是最显著位置的Activity(他的onPause() 方法被调用)例如,如果显著进程作为一个对话框被显示并允许前面的activity显示在其后面,这样的进程会被认为相当重要而不可以kill掉,除非能保证前面的显著进程可以运行
3. service process(服务进程)持有一个已经通过startService() 方法启动的Service尽管这些进程并不被用户直接看到,但他同样在处理一些用户很关心的事情,比如Mp3在后台的播放,已经文件的上传下载。所以系统会一直保持这些进程的运行,除非内存已无法维持显著进程与可见进程的运行。
4. background process(后台进程) 持有一个用户已不可见的Activity onStop() 方法已被调用。这些进程对用户体验来说没有直接的影响,只要他们正确的执行activity的生命周期。系统会在任意时刻kill掉这类进程并释放内存给前面三类进程。通常系统中这类进程会很多,他们会保存在LRU列表中,当系统内存降低时用户最近访问的的进程将最后被kill掉。
5. empty process(空进程)不包含任何应用程序组件。保留这些进程的作用其实是为了充当缓存,提高应用程序下一次启动的速度。因此系统会进程kill掉这类进程用于平衡整个系统在缓存进程和潜在的核心缓存之间的资源。
2)activity作为服务的功能:
在android的窗体系统中,窗体其实也有服务的功能在里面,这个是什么意思呢,就是说一个activity就是为一种特定的显示服务而存在的,其他的activity都可以调用这个显示服务。我们先以一个例子来说明这个特点。
比如我们在window下用vc开发的两个窗体程序A,B。
A是一个多媒体程序,可以浏览图片,也可以播放电影,同时可以下载。
B也是一个多媒体程序,可以播放电影,可以看书。
那么在vc开发时,A,B肯定都要开发播放电影的界面及后台模块,A还要开发一个浏览图片的界面相关模块,B要开发阅读书籍的模块。
其实上面A,B有共同的功能部分就是播放电影,但是他们仍然要各自实现,可见这个功能部分没有实现代码及服务重用。
那在andorid是如何实现的,A是一个activity,B也是一个activity,同时有一个播放电议的movie activity,还有一个浏览图片的pic activity,同时还有一个显示书籍的book activity,然后A只需实现显示电影及图片名称的控件即可,当用户选定一个电影时,A通过android系统创建一个movie activity即可,当然要通过intent变量传递电影名参数。B中看电影也是如此,这样就达到了功能(在android叫服务)重用,可见这个是SOA的一种很好体现。也许就有人会说了,各种服务一样了,那不是丧失个性了,其实这个问题很好解决,当你觉得你想要个性时,你自己再写一个activity啊,即使如此,重用性也比原来那种方式好,况且在嵌入式设备商,这种过分要求个性的是很不划算的。