摘要:目前Android的程序只能用Java来开发,我对Java其实并不是很熟悉,只是草草看过一本入门的书,印象没有C那么深刻,但是还好,就Android的开发来说这已经足够了。
下载了Android的SDK和一些辅助的玩意我就开始折腾了,IDE是Eclipse。Android开发的屏幕布局采用XML布局方式,部分资源,包括字符串、控件等等以XML的形式声明在res文件夹下,在主程序中调用,很常见的情况是在XML文件里声明控件,比如TextView之类的,然后再主程序中new一个控件,直接调用XML声明的相应部分。而在XML文件中,已经把该资源的全部属性设定好,包括长、宽、字体大小、颜色等。这无形中把资源给“模块化”了。
android基于Linux内核这种事已经不算新鲜事了,很多系统都基于Linux内核。但是android的特别之处除了开发上的特点以外,还有一个就是程序在运行时的行为和以往我接触到的程序运行机制有很大不同。在传统PC机或者其他一些手机上,用户对应用程序有绝对的掌控权,在应用程序的系统菜单上选择“退出”或者“关闭”之类的选项会直接杀死进程,而在android系统中不是这样的。在android中,应用程序的生命周期并不是由应用程序自身直接控制的,而是由系统,当系统需要释放内存来运行新进程或者保证某些后台进程和前端进程顺利执行的时候才会释放相应应用程序的资源,这个释放过程有一个重要性的层次。
android中进程的层次如下(重要性由高到低):
1、前端进程。顾名思义,前端进程就是目前显示在屏幕上和用户交互的进程,在系统中前端进程数量很少,而这种进程是对用户体验的影响最大,只有系统的内存稀少到不足以维持和用户的基本交互时才会销毁前端进程。因此这种进程重要性是最高的。
2、可见进程。可见进程也拥有一个可视化的界面,只是目前不是最上层界面(最上层界面在前端进程里面),可见进程一般调用了OnPause(),可见进程比前端进程重要性低,但是在交互方面影响还是很大,因为用户可能随时切换过去,所以系统不会轻易销毁它。
3、服务进程。一个服务进程就是一个Service,它调用了startService(),就是UNIX中说的守护进程,对用户不可见,但是保证了一些重要的事件被监听或者维持着某些状态,比如网络数据传输、后台音乐播放,这类进程在内存不足且为了保证前端交互的顺利进行的时候被销毁。
4、后台进程。这里叫后台进程可能会和一般意义上的后台进程混淆,要说明的是,android里的后台进程是调用了OnStop()的,可以理解成用户暂时没有和这个进程交互的愿望,所以这里后台进程有点“待销毁”的意思。
5、空进程。这是一种系统缓存机制,其实就是个进程的外壳,当有新进程创建的时候,这个空进程可以加快进程创建速度,当系统内存不足的时候,首先销毁空进程。
android中进程重要性层次
说了程序运行机制就不得不来看看一个进程从创建到被销毁的全过程:
进程从创建到被销毁全过程
一个进程创建时系统会为它创建一个Activity(活动),紧接着调用onCreate(),onCreate()中主要是进行一些初始化,例如读取XML资源文件创建布局,设置主界面各种监听函数等等,每个进程都会调用onCreate()。
接着是onStart(),需要说明的是,在默认 Activity中(就是程序一启动我们看到的那个Activity实体),程序员在写代码的时候并不需要显式去调用onStart(),系统会默默帮你调用;但是,当你需要在这个程序中创建除了默认Activity以外的所有新Activity的时候,你必须显式调用这个onStart(),这个 onStart()有个新名字叫做startActivity(intent),这里的intent表示一个意图,就是我们想创建的新Activity,这个扯远了。
然后是onResume(),当我们从主程序界面跳到别的地方再跳回来的时候调用onResume()。然后程序就跑起来了,我们叫他进程 A,如果这个时候其他进程变成了前端进程(进程B),此时进程A就会调用onPause(),这会保存进程的状态做数据持久化。这时候有两种情况,进程A 再次成为前端进程,于是进程A调用onResume()来恢复运行;如果在进程A处于onPause()这段时间内系统内存不足了,进程A就有可能被销毁,来为别的进程腾出内存(为什么是“可能”被销毁?详见上面的android进程重要性层次说明),如果用户再次切换到进程A,这是系统只是重新创建一个进程,它不再是进程A了(因为此时进程A已经被销毁了)。
当onPause()被调用以后用户按了返回键(back),那进程A会调用 onStop(),之前说了用户此时已经没有和进程A交互的愿望了,所以进程A成为了“待销毁”的对象(为什么没有直接销毁呢?答案还是在android 进程重要性层次说明)。那么如果在一个进程A还没有被销毁的时刻用户再次切换到进程A,进程A又成为了前端进程,此时进程A会调用 onRestart(),进而调用onStart()来再次开始进程(此时重新开始的还是进程A本身,没有换成其他的,因为进程A还未被销毁),在这里可以理解成把进程A“唤醒”了。如果很不幸,系统内存又不足了,调用了onStop()后的进程A可能再次被销毁,就像图上画的那样,这里不再赘述。至于 onStop()后面的onDestroy()调用是在系统内存不足的时候由系统调用来销毁进程和释放内存的。