在过去两年里,虽然学习了许多,掌握了许多,同时也忘记了许多平时工作比较小用到的知识,特别是现在的工作与上份工作方向不同时特别明显。所以,为了避免拾了一个西瓜又掉了原来的西瓜的情况重复发生,我决定每隔一段时间就把自己所学、所得写到博文里,相信通过这种方式可以把学到的东西进行进一步的加固,也可以与有兴趣的网友们分享,如大家发现有错误的东西,也可以指出来,大家互相学习互补,好了不废话了,开始回忆!
虽然接触Android的时间不长,但怎样说又是下过心学习过,也从事过一段时间所以需要温习的知识又是有一些的。首先,先说从大的角度来谈下android系统吧,android由底层操作系统,本地系统库,android运行环境,应用程序框架和应用程序几个大的模块组成的。android的底层操作系统其实是linux2.6,android4.0版本以上的则是基于linux3.0;至于本地库主要包括:标准C系统库、多媒体库基于packetvideo的openCORE引擎、SGL-2D图形引擎、3D库-》实现了OpenGLES、SQLite、webKit->提供一个浏览器、FreeType->服务于位图和矢量字体的绘制;android运行环境(Dalvik虚拟机)class文件过"dx"工具转换成.dex文件格式,更适合嵌入式平台。每个android应用程序运行在单独的虚拟实例之上;应用程序框架:其中有图形用户界面组件,包括ListView、WebView、Button;用于应用程序之间共享数据的Content Provider机制;SQLite提供的相关数据操作API;资源管理器;管理应用程序生命周期的activityManager;移动多媒体框架;Service组件。最后是应用程序,android内置的核心应用程序、包括邮件客户端、电话、短消息、日历、浏览器、联系人等。
对Android系统有一个宏观的、纵向的了解其实对android的向后发展和学习挺有用的,其中android的运行环境特别重要,所以重点了解了一下。首先,android程序是由java程序编写,java源文件经过编译后得到class文件,然后再用aapt工具把class文件转换成dex文件;android每启动一个程序,就启动一个linux进程和资源管理;应用程序文件也不共享,但可通过android提供的Content Provider机制。暴露给其它应用程序;android平台一应用程序,一个进程,一个虚拟机实例的实现:zygote是一个虚拟机进程,同时也是虚拟机实例的孵化器,每执行一程序时,zygote就会fork出一子进程来执行程序.zygote进程在系统启动时启动,完成虚拟机的初始化、库加载、预置类库的加载和初始化操作,系统需要新虚拟机实例时,zygote和所有虚拟机实例都共享一块内存区域.
好了上面,都是从宏观的角度来了解android系统,现在就进一步细化来学习android系统吧.我想,首先要提到的应该是android系统的四大组件吧,这是最基础的,同时也是需要最了解的知识点了,因为在开发的过程中是使用得最频繁的,所以我们务必好好掌握。那究竟是那四大组件呢?没错就是它们了:Activity(活动/窗体)、Content Provider(内容提供者)、Service、BroadcastReceiver。它们是我们进行android开发的基础,有了他们,我们才可以开始android的相关开发,现在我们逐一了解吧。
Activity.
其实这是最基本的组件,没了它,我们打开android程序什么都看不见,当然我并不说所有activity都是可以见到的。好吧,让我们具体了解下吧。提到Activity,第一时间就必须要提到应用程序的生命周期了。在介绍生命周期前,我们先了解一下android系统根据不同的进程状态,引入了不同的不同的重要性分级。a.前台进程:activity调用了onResume(),进程中有一个正在运行的intent receiver,进程有一个服务,并在服务的某个回调函数内有正在执行的代码;b.可见进程:可见但不在前台(进程的onPause()被调用);c.服务进程:服务进程有一个已经用startService()方法启动的服务;d.后台进程:用户看不见的进程(调用onStop()方法);e.空进程:空进程不拥有任务活动的进程。被保留的原因是下次应用程序的某个组件需要运行时,不需要重新创建进程,可以提高启动速度.
有了这些进程分级的概念,我们再去了解生命周期,这样我们会更加容易理解。Activity生命周期:a.void onCreate(Bundle saveInstanceState),这个阶段不可见,是当Activity被第一次加载时执行的;b.void onStart()可见,但不可以操作。是紧跟onCreate()事件之后执行的,还是另外一种情况也会执行:onStop()->onRestart()->onStart();则窗体被交换到后台,过了一段时间执行了onStop(),但还没有被销毁时,用户再次查看窗体,就会被触发了。C.void onResume()可见且可操作,在onStart()事件之后执行,当前窗体可以与用户交互,另外onPause()->onResume(),也会触发,也就是说当窗体与后台交换,并没执行到onStop并没有销毁时,用户再次查看窗体,此时系统会跳过onCreate()和onStart(),直接执行onResume()。这提高了系统程序的响应速度,让用户体验更加流畅,系统不用频繁地销毁和创建窗体。不过这可能也是android系统和程序占用手机内存比较大的原因吧,又就是说其实对于一些常用的程序,我们大可不必时常去清除手机的占用内存,这样反尔会下次启动程序时会更慢些。d.void onPause()可见不可操作.这种情况比较常见,例如,当前的窗体被弹出窗体挡住了。这是Activity被杀死前,唯一会被执行的,所以一般会在此处,做一下数据保存之类的r操作,以防用户数据丢失。e.void onStop()不可见,onPause()后如何用户有一段时间不查看此Activity,就是执行onStop(),把窗体从当前Task中移除。但请注意,此时的activity还没有真正被销毁.f.void onRestart()不可见.onStop()->onRestart()->onStart().窗体被交换到后台,并过了一段时间执行了onStop(),但还没有被销毁,用户再次查看窗体时执行.g.void onDestroy()执行onStop()事件后,如果窗体没再次被查看,当系统需要释放内存时会把窗体销毁,些时Activity才真正地结束了.另外需要说明的是,在执行OnStop前,窗体还在当前的Task中。启动一个应用程序,就生成新的Task(堆栈),堆栈中可以存放多个Activity."Back"键的作用是把当前Task中顶部的activity弹出,而不是回到前一个Task.
对于Activity,除了生命周期过有几点我还需要介绍一下。1、Task与Activity的亲属关系,在默认情况下,一个应用程序的所有Activity都有亲属经,它们都属于同一个Task,但可以通过<activity>标签中的taskAffinity属性修改Task与Activity的关系或把<activity>的allowTaskRepareniting属性设置为true。2、Task的清除,在默认情况下,用户长时间离开程序,系统会动消除除了要Activity之外的所有Activity。但我们可以通过以下方法改变:方法1、通过设置Task内根Activity(就是启动程序的Activity)的属性改变此行为;a.alawaysRetainTaskState=true,这样系统就不会主动消除堆栈了.b.clearTaskOnLaunch=true,用户离开后返回,会消除除根Activity之外的所有activity.c.finishOnTaskLaunch=true,返回时所有包含根Activity都会被消除;方法2:当包含FLAG_ACTIVITY_CLEAR_TOP的Intend到来时,会删除Task的所有Activity.方法2:目标Activity启动模式为standard,目标Activity也会被先删除,再创建一个新的.
好了,今天先回忆到这吧,还有许多内容要写呢,为了避免文章又长又臭,就分开几篇慢慢回忆吧!!